Java LinkedHashSet backwards iteration

拈花ヽ惹草 提交于 2019-11-30 07:59:19

问题


How can I iterate through items of a LinkedHashSet from the last item to the first one?


回答1:


If you want to continue to use collections, you could use the following:

LinkedHashSet<T> set = ...

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

If you're fine with using an array instead, you could take a look at hvgotcodes' answer.




回答2:


er, assuming you mean LinkedHashSet...

I would use toArray and just use a reverse for loop.

There might be a better way to do it, but that should work. toArray guarantees any order is preserved

If this set makes any guarantees as to what order its elements are returned by its iterator, this method must return the elements in the same order.

Something like

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

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



回答3:


This is another way:

LinkedHashSet<T> set = ...

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

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



回答4:


If you really meant LinkedHashSet, you could put the elements into an ArrayList and then use the ArrayList's ListIterator.

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



回答5:


From the javadoc: "This linked list defines the iteration ordering, which is the order in which elements were inserted into the set (insertion-order)."

So you can simply:

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


来源:https://stackoverflow.com/questions/10741902/java-linkedhashset-backwards-iteration

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!