【问题标题】:Java LinkedHashSet backwards iterationJava LinkedHashSet 向后迭代
【发布时间】:2012-05-31 07:08:28
【问题描述】:

如何遍历 LinkedHashSet 的最后一项到第一项?

【问题讨论】:

  • 为什么在 Java Collection Framework 中不包含它。 LinkedHashSet 维护 FIFO 顺序,因此应该有一个将顺序转换为 LIFO 的实用程序,当需要维护插入顺序同时我们可能需要以相反的顺序迭代时,这似乎很方便。在我的项目中,有几次我已经需要这个了。不幸的是,我必须使用 List 作为中介来利用 Collections.reverse() 实用程序。这很脏是不是!
  • 这一直是个问题。有proposals 来解决它。

标签: java set iteration linkedhashset


【解决方案1】:

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

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

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

如果这个集合保证了它的元素是什么顺序 由它的迭代器返回,这个方法必须返回 相同的顺序。

类似

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

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

【讨论】:

  • 您的代码似乎无法编译:MyType[] asArray = mySet.toArray();
  • 无法将对象数组转换为 MyType 数组。此代码无法编译。
【解决方案2】:

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

【讨论】:

  • "从最后一个到第一个。"
【解决方案3】:

如果您想继续使用集合,可以使用以下方法:

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

【讨论】:

  • new LinkedList&lt;&gt;(set) 将复制所有项目,不是吗?
  • @Sasha 是的,会的。
【解决方案4】:

这是另一种方式:

LinkedHashSet<T> set = ...

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

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

【讨论】:

    【解决方案5】:

    如果您真的是指 LinkedHashSet,您可以将元素放入 ArrayList,然后使用 ArrayList 的 ListIterator。

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

    【讨论】:

      猜你喜欢
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      相关资源
      最近更新 更多