2012-05-24 8 views
17

Come è possibile scorrere tra gli elementi di un LinkedHashSet dall'ultimo elemento al primo?Java LinkedHashSet iterazione all'indietro

+0

Perché in Java Collection Framework non è incluso. LinkedHashSet mantiene l'ordine FIFO quindi dovrebbe esserci un'utilità per convertire l'ordine in LIFO che sembra essere a portata di mano quando il requisito è mantenere l'ordine di inserimento allo stesso tempo, potremmo aver bisogno di iterare in ordine inverso. Nel mio progetto c'erano già un paio di volte che avevo bisogno di questo. Sfortunatamente, devo usare List come intermediario per sfruttare l'utility Collections.reverse(). Questo è sporco, no? – Bhavesh

risposta

19

Se si desidera continuare ad utilizzare le collezioni, è possibile utilizzare il seguente:

LinkedHashSet<T> set = ... 

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

Se stai bene con l'utilizzo di una matrice, invece, è potrebbe dare un'occhiata a hvgotcodes' answer.

+0

Il 'new LinkedList <> (set)' copierà tutti gli elementi, non è vero? – Sasha

+0

@Sasha Sì, lo farà. – Jeffrey

7

er, supponendo che si intende LinkedHashSet ...

userei toArray e basta usare un rovescio ciclo for.

Potrebbe esserci un modo migliore per farlo, ma dovrebbe funzionare. toArray garanzie qualsiasi ordine conservata

Se questo set rende alcuna garanzia in quanto alle quale ordine i suoi elementi sono restituito dalla propria iteratore, questo metodo deve restituire gli elementi nel stesso ordine.

Qualcosa di simile

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

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

Funziona ma è piuttosto inefficiente perché copia il set ... – fig

-7

Dal javadoc: "Questa lista collegata definisce l'ordine iterazione, che è l'ordine in cui gli elementi sono stati inseriti nel set (inserimento-ordine)."

Quindi si può semplicemente:

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

"dall'ultimo al primo." – hvgotcodes

5

Questo è un altro modo:

LinkedHashSet<T> set = ... 

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

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

Se davvero voleva dire LinkedHashSet, si potrebbe mettere gli elementi in un ArrayList e quindi utilizzare ListIterator del ArrayList.

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