Вы можете сделать это с помощью ListIterator:
for(ListIterator<O> outer = list.listIterator(); outer.hasNext() ; ) {
O oVal = outer.next();
for(ListIterator<O> inner = list.listIterator(outer.nextIndex()); inner.hasNext(); ) {
Test(oVal, inner.next());
}
}
Для связанного списка (который имеет медленный доступ к индексу), list.listIterator(index)
все же необходимо выполнить итерацию в нужное место.Но в этом случае это только O (n²) (и вы не можете стать лучше, чем это) вместо O (n³), как тогда доступ к индексу в других ответах.(Вы можете быть еще быстрее, если сначала скопируете свой список в массив, но здесь это только постоянный фактор.)
Конечно, если вам обычно требуется доступ на основе индекса (или это клонирование итератора), вам лучше использовать список на основе массива (или пользовательский список, итератор которого поддерживает клонирование).