Обратная итерация Java LinkedHashSet
Как я могу перебирать элементы LinkedHashSet
от последнего пункта к первому?
5 ответов
Если вы хотите продолжать использовать коллекции, вы можете использовать следующее:
LinkedHashSet<T> set = ...
LinkedList<T> list = new LinkedList<>(set);
Iterator<T> itr = list.descendingIterator();
while(itr.hasNext()) {
T item = itr.next();
// do something
}
Если вы в порядке с использованием массива вместо этого, вы можете взглянуть на hvgotcodes' ответ.
er, предполагая, что вы имеете в виду LinkedHashSet...
Я хотел бы использовать toArray и просто используйте обратный цикл.
может быть лучший способ сделать это, но это должно сработать. toArray
гарантирует сохранение любого заказа
Если этот набор дает какие-либо гарантии относительно того, в каком порядке его элементы возвращаемый итератором, этот метод должен возвращать элементы в тот же порядок.
что-то вроде
Set<MyType> mySet = new LinkedHashSet();
...
MyType[] asArray = mySet.toArray();
for (int i = asArray.length - 1; i>=0; i--){
..
}
это другой способ:
LinkedHashSet<T> set = ...
List<T> list = new ArrayList<>(set);
Collections.reverse(list);
for( T item : list ){
...
}
Если вы действительно имели в виду LinkedHashSet, вы можете поместить элементы в ArrayList, а затем использовать ListIterator ArrayList.
ListIterator<T> l = new ArrayList<T>(yourLinkedHashList).listIterator();
// ListIterator can iterate in reverse
while(l.hasPrevious()) {
T obj = l.previous();
}
из 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);
}