2012-05-24 30 views
17

如何迭代LinkedHashSet從最後一項到第一項的項目?Java LinkedHashSet向後迭代

+0

爲什麼在Java Collection Framework中不包括它。 LinkedHashSet保持FIFO的順序,所以一個將訂單轉換爲LIFO的實用程序應該在那裏,當需要維持插入順序的同時,我們可能需要以相反的順序進行迭代,這似乎是非常方便的。在我的項目中,有一段時間我需要這個。不幸的是,我必須使用List作爲中介來利用Collections.reverse()實用程序。這不骯髒! – Bhavesh

回答

19

如果你想繼續使用集合,你可以使用以下方法:如果你是罰款使用數組,而不是

LinkedHashSet<T> set = ... 

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

,你可以看看hvgotcodes' answer

+0

'新的LinkedList <>(set)'將複製所有項目,不是嗎? – Sasha

+0

@Sasha是的,它會的。 – Jeffrey

7

呃,假設你的意思LinkedHashSet ...

我會用toArray,只是使用反向for循環。

可能有更好的方法來做到這一點,但這應該工作。 toArray保證任何順序被保存

如果這組作出任何保證,以什麼責令其元素 按其迭代器返回,這種方法必須返回在 同一順序的元素。

喜歡的東西

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

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

這可以工作,但是效率很低,因爲它將設置... – fig

-7

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

「從最後一個複製到第一個」。 – hvgotcodes

5

這是另一種方式:

LinkedHashSet<T> set = ... 

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

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

如果你真正的意思LinkedHashSet,你可以把元素融入到一個ArrayList,然後使用ArrayList的的ListIterator。

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