Подтвердить что ты не робот

Повторная итерация Java LinkedHashSet

Как я могу перебирать элементы LinkedHashSet из последнего элемента в первый?

4b9b3361

Ответ 1

Если вы хотите продолжать использовать коллекции, вы можете использовать следующее:

LinkedHashSet<T> set = ...

LinkedList<T> list = new LinkedList<>(set);
Iterator<T> itr = list.descendingIterator();
while(itr.hasNext()) {
    T item = itr.next();
    // do something
}

Если у вас все в порядке с использованием массива, вы можете посмотреть ответ hvgotcodes.

Ответ 2

er, предполагая, что вы имеете в виду LinkedHashSet...

Я бы использовал toArray и просто использовал обратный цикл.

Там может быть лучший способ сделать это, но это должно сработать. toArray гарантирует сохранение любого заказа

Если этот набор дает какие-либо гарантии относительно того, в каком порядке его элементы возвращенный его итератором, этот метод должен возвращать элементы в тот же порядок.

Что-то вроде

Set<MyType> mySet = new LinkedHashSet();
...
MyType[] asArray = mySet.toArray();

for (int i = asArray.length - 1; i>=0; i--){
..
}

Ответ 3

Это другой способ:

LinkedHashSet<T> set = ...

List<T> list = new ArrayList<>(set);
Collections.reverse(list);

for( T item : list ){
   ...
}

Ответ 4

Если вы действительно имели в виду LinkedHashSet, вы могли бы поместить элементы в ArrayList, а затем использовать ArrayList ListIterator.

ListIterator<T> l = new ArrayList<T>(yourLinkedHashList).listIterator();
// ListIterator can iterate in reverse
while(l.hasPrevious()) {
    T obj = l.previous();
}

Ответ 5

Из javadoc: "Этот связанный список определяет порядок итераций, который является порядком, в котором элементы были вставлены в набор (порядок вставки)."

Итак, вы можете просто:

LinkedHashSet<Integer> numbers = new LinkedHashSet<Integer>();
numbers.add(1);
numbers.add(2);
numbers.add(33);
numbers.add(44);
numbers.add(108);

for (Integer i : numbers) {
    System.out.println(i);
}