2012-05-24 15 views
17

¿Cómo puedo iterar a través de los elementos de un LinkedHashSet del último elemento al primero?Java LinkedHashSet iteración hacia atrás

+0

Por qué en Java Collection Framework no está incluido. LinkedHashSet mantiene el orden FIFO, por lo que una utilidad para convertir el pedido en LIFO debe estar allí, lo que parece ser útil cuando el requisito es mantener el orden de inserción al mismo tiempo que es posible que tengamos que iterar en orden inverso. En mi proyecto ya había un par de veces que necesitaba esto. Desafortunadamente, tengo que usar List como intermediario para aprovechar la utilidad Collections.reverse(). Esto es sucio, ¿no? – Bhavesh

Respuesta

19

Si desea seguir utilizando las colecciones, se puede utilizar el siguiente:

LinkedHashSet<T> set = ... 

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

Si usted está muy bien con el uso de una matriz en su lugar, podría echar un vistazo al hvgotcodes' answer.

+0

La 'nueva LinkedList <> (set)' copiará todos los elementos, ¿no? – Sasha

+0

@Sasha Sí, lo hará. – Jeffrey

7

er, suponiendo que decir LinkedHashSet ...

me gustaría utilizar toArray y sólo tiene que utilizar un revés para el lazo.

Puede haber una forma mejor de hacerlo, pero debería funcionar. toArray garantías cualquier orden se conserva

Si este conjunto hace ninguna garantía en cuanto a qué ordenar sus elementos están devuelto por el iterador, este método debe devolver los elementos en el mismo orden .

Algo como

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

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

Esto funciona pero es bastante ineficiente porque copia el conjunto ... – fig

-7

Desde el javadoc: "Este lista enlazada define el orden de iteración, que es el orden en que los elementos se insertaron en el conjunto (inserción orden)."

Así que usted puede simplemente:

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

"del último al primero". – hvgotcodes

5

Ésta es otra manera:

LinkedHashSet<T> set = ... 

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

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

Si realmente se quiere decir LinkedHashSet, podría poner los elementos en un ArrayList y luego usar ListIterator del ArrayList.

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