Jak mogę iterować elementy z LinkedHashSet
od ostatniego elementu do pierwszego?Java LinkedHashSet itallation do tyłu
Odpowiedz
Jeśli chcesz nadal korzystać z kolekcji, można użyć następujących:
LinkedHashSet<T> set = ...
LinkedList<T> list = new LinkedList<>(set);
Iterator<T> itr = list.descendingIterator();
while(itr.hasNext()) {
T item = itr.next();
// do something
}
Jeśli jesteś w porządku z pomocą tablicy zamiast tego, może spojrzeć na hvgotcodes' answer.
er, zakładając, że masz na myśli LinkedHashSet ...
użyłbym toArray i po prostu użyć odwrotnego pętli for.
Może istnieć lepszy sposób na zrobienie tego, ale to powinno zadziałać. toArray
gwarancje dowolny porządek jest zachowany
Jeśli ten zestaw sprawia żadnych gwarancji, co zamówić jego elementy są zwrócony przez jego iterator, ta metoda musi zwrócić elementy w samej kolejności.
Coś
Set<MyType> mySet = new LinkedHashSet();
...
MyType[] asArray = mySet.toArray();
for (int i = asArray.length - 1; i>=0; i--){
..
}
Działa to, ale jest dość nieefektywne, ponieważ kopiuje zestaw ... – fig
Z javadoc „to związana lista określa kolejność iteracji, która jest kolejność w której elementy zostały umieszczone w zestawie (zanurzeniowego kolejności).”
więc można po prostu:
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);
}
"od ostatniego do pierwszego." – hvgotcodes
Jest to kolejny sposób:
LinkedHashSet<T> set = ...
List<T> list = new ArrayList<>(set);
Collections.reverse(list);
for(T item : list){
...
}
Jeśli naprawdę oznaczało LinkedHashSet, można umieścić elementy do ArrayList, a następnie użyć ListIterator ArrayList jest.
ListIterator<T> l = new ArrayList<T>(yourLinkedHashList).listIterator();
// ListIterator can iterate in reverse
while(l.hasPrevious()) {
T obj = l.previous();
}
Dlaczego w Java Collection Framework nie jest uwzględniony. LinkedHashSet utrzymuje zamówienie FIFO, więc narzędzie do konwersji zlecenia na LIFO powinno tam być, co wydaje się być bardzo przydatne, gdy wymaganiem jest utrzymanie zamówienia reklamowego w tym samym czasie, gdy potrzebujemy go do iteracji w odwrotnej kolejności. W moim projekcie był już czas, którego potrzebowałem. Niestety, używam List jako pośrednika do skorzystania z narzędzia Collections.reverse(). To jest brudne, prawda? – Bhavesh