26

如何LinkedHashSet从最后一项到第一项迭代 a 的项?

4

5 回答 5

29

如果您想继续使用集合,您可以使用以下内容:

LinkedHashSet<T> set = ...

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

如果您可以改用数组,则可以查看hvgotcodes 的答案

于 2012-05-24T16:58:21.820 回答
7

呃,假设你的意思是 LinkedHashSet ...

我会使用toArray并且只使用反向 for 循环。

可能有更好的方法来做到这一点,但这应该有效。 toArray保证保留任何订单

如果此集合对其迭代器返回其元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。

就像是

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

for (int i = asArray.length - 1; i>=0; i--){
..
}
于 2012-05-24T16:53:52.393 回答
7

这是另一种方式:

LinkedHashSet<T> set = ...

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

for( T item : list ){
   ...
}
于 2012-05-24T17:01:58.613 回答
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();
}
于 2012-05-24T17:07:19.897 回答
-10

来自 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);
}
于 2012-05-24T16:57:25.317 回答