2012-05-24 13 views
17

Jak mogę iterować elementy z LinkedHashSet od ostatniego elementu do pierwszego?Java LinkedHashSet itallation do tyłu

+0

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

Odpowiedz

19

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.

+0

"Nowa lista_połączeń <> (zestaw)" skopiuje wszystkie elementy, prawda? – Sasha

+0

@Sasha Tak, będzie. – Jeffrey

7

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--){ 
.. 
} 
+0

Działa to, ale jest dość nieefektywne, ponieważ kopiuje zestaw ... – fig

-7

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); 
} 
+1

"od ostatniego do pierwszego." – hvgotcodes

5

Jest to kolejny sposób:

LinkedHashSet<T> set = ... 

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

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

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(); 
}