【问题标题】:Iterator has .next() - is there a way to get the previous element instead of the next one?迭代器有 .next() - 有没有办法获取前一个元素而不是下一个元素?
【发布时间】:2011-02-15 21:37:51
【问题描述】:

我有一个在 HashMap 上使用的迭代器,我保存并加载了迭代器。 有没有办法使用迭代器获取 HashMap 中的前一个键? (java.util.Iterator)

更新

我将它保存为 Red5 连接中的一个属性,然后将其加载回来以在我停止的地方继续工作。

另一个更新

我正在遍历 HashMap 的键集

【问题讨论】:

  • 注意:HashMap 没有固定的顺序,可能会根据对象的哈希码而改变。如果您想要一个有序的Map,请考虑TreeMap(按键自动排序)或LinkedHashMap(插入顺序)。

标签: java collections iterator


【解决方案1】:

您可以使用ListIterator 代替Iterator。 ListIterator 有previous()hasPrevious() 方法。

【讨论】:

  • 谢谢,很有帮助!
【解决方案2】:

不是直接的,正如其他人指出的那样,但如果你例如需要访问前一个元素,您可以轻松地将其保存在单独的变量中。

T previous = null;
for (Iterator<T> i = map.keySet().iterator(); i.hasNext();) {
    T element = i.next();

    // Do something with "element" and "previous" (if not null)

    previous = element;
}

【讨论】:

  • ...虽然我真的不知道在什么情况下这在迭代 随机排序 HashMap 键 时会有用
  • 感谢您指出 hashmap 键是随机排序的。
  • @ufk:欲了解更多信息,请不要错过 BalusC 对问题的评论!
【解决方案3】:

听起来您希望数组语义更类似于 ListIterator 而不是 Iterator 接口提供的那些语义。获取这种东西的最简单方法可能是构造一个列表(从键集(LinkedList&lt;K&gt; keyList = new LinkedList&lt;K&gt;(map.keySet())),然后手动使用 ListIterator 而不是常规的 Iterator 或 foreach。

对于需要记住连续项目的非常简单的情况,最简单的处理方法是将之前的 Key 存储在局部变量中,并在循环结束时更新它。

【讨论】:

    【解决方案4】:

    不,Iterator&lt;E&gt; 只定义了 3 个方法:

    boolean hasNext()
    E next()
    void remove() 
    

    您当然可以实现自己的迭代器。

    【讨论】:

      【解决方案5】:

      正如其他人所说,您只能使用next() 访问元素。然而,这有点是一个术语问题。一旦你调用next(),这个就是当前元素。

      除非问题是每次迭代都需要查看集合中的两个连续项,在这种情况下,一个简单的变量似乎最简单。

      【讨论】:

        【解决方案6】:

        虽然Set 没有提供反向迭代器的方法,但Deque 提供了。您可以将descendingIterator() 用于反向 顺序的迭代器,iterator() 用于正向 顺序的迭代器。

        (您可以通过Deque&lt;T&gt; deque = new LinkedList&lt;T&gt;(set)Set 创建Deque,其中set 是您的SetT 您正在使用的泛型类型。)

        【讨论】:

        • +1 用于应用“了解并使用库”。不过,不确定这是否是解决 OP 根本问题(无论是什么)的最佳解决方案。
        【解决方案7】:

        最终Iterators 并不完全适合您的任务。

        为什么不从您的Set(例如通过List list = new LinkedList(set))创建一个List,并使用标准索引for 循环进行迭代?这样你就知道前一个元素在i - 1

        【讨论】:

        • 请注意,在大数据量下随机访问 LinkedList 会非常缓慢。对于链接数据结构,您几乎总是希望使用迭代器。
        【解决方案8】:

        使用迭代器,不,您没有选项来获取先前的键值。它只有 hasNext() 和 next() 方法。

        【讨论】:

          【解决方案9】:

          不,你不能。 Iterator 接口没有获取前一个元素的方法。

          但是你可以做的是——有点垃圾——创建一个List&lt;Entry&lt;Integer, YourObjectType&gt;&gt;,其中Integer-value 代表键对象的哈希码。然后你可以这样做:

          for (int i = 0; i < list.size(); i++)
          {
              YourObjectType current = list.get(i).getValue();
              YourObjectType previous = (i == 0 ? null : list.get(i - 1).getValue());
              // Do whatever you want
          }
          

          我知道这很垃圾,但有可能

          【讨论】:

            【解决方案10】:

            制作你自己的迭代器:

            public class EnhancedIterator<E> implements Iterator<E>{
                private List<E> list;
                private int indexSelected=-1;
                public EnhancedIterator(List<E> list){
                    this.list=list;
                }
            
                @Override
                public boolean hasNext() {
                    return indexSelected<list.size()-1;
                }
            
                @Override
                public E next() {
                    indexSelected++;
                    return current();
                }
            
                @Override
                public void remove() {
                    list.remove(indexSelected);
                }
                public void remove(int i){
                    list.remove(i);
                    if(i<indexSelected){
                        indexSelected--;
                    }
                }
                public E previous(){
                    indexSelected--;
                    return current();
                }
                public E current(){
                    return list.get(indexSelected);
                }
                public E get(int i){
                    return list.get(i);
                }
            }
            

            【讨论】:

            • 如果你有一个List,你应该调用List.listIterator()。它更容易并且使用标准类型。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-07
            • 1970-01-01
            相关资源
            最近更新 更多