Вы можете использовать метод listIterator
для списка, возвращающего объект ListIterator
, который будет проходить по вашему списку по порядку.Наиболее важно, что метод может быть вызван с необязательным параметром index
для запуска в заданной точке списка.Также ListIterator
удобно знает свой текущий индекс, который мы можем использовать для установки нашего второго итератора.
Пример может выглядеть так:
List<Integer> list = new LinkedList<Integer>(Arrays.asList(1, 2, 3));
ListIterator<Integer> i = list.listIterator();
while (i.hasNext())
{
ListIterator<Integer> j = list.listIterator(i.nextIndex());
int iV = i.next();
while (j.hasNext())
{
collect(iV, j.next());
}
}
, который вызывает collect
дляследующие пары:
1, 1
1, 2
1, 3
2, 2
2, 3
3, 3
Как правильно сказано, это оставляет нам вызов list.listIterator(i.nextIndex())
, имеющий потенциальную сложность O (n) .
Итак, другое решениеесли память не является проблемой, убедитесь, что ваш List
относится к типу, который легко доступен случайным образом (например, список на основе массива, такой как ArrayList
), и копирование ваших данных в таком списке не должно иметь место.