迭代器有.next() – 有没有办法获取前一个元素而不是下一个元素?

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

更新

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

另一个更新

我正在遍历HashMap的键集

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

 T previous = null; for (Iterator i = map.keySet().iterator(); i.hasNext();) { T element = i.next(); // Do something with "element" and "previous" (if not null) previous = element; } 

您可以使用ListIterator而不是IteratorhasPrevious()具有previous()hasPrevious()方法。

听起来您希望数组语义更类似于ListIterator而不是Iterator接口提供的那些。 获取此类内容的最简单方法是构造一个列表(来自键集( LinkedList keyList = new LinkedList(map.keySet()) ),然后手动使用ListIterator而不是常规迭代器或foreach。

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

不, Iterator只定义了3种方法:

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

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

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

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

虽然Set没有提供反向迭代器的方法,但Deque确实如此。 您可以使用descendingIterator()反向顺序使用迭代器,使用iterator() ,以迭代顺序使用迭代器。

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

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

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

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

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

但你可以做的是 – 有点垃圾 – 创建一个List> ,其中Integer List>代表key-object的哈希码。 然后你可以做这样的事情:

 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 } 

我知道这是非常垃圾,但这是可能的

制作自己的迭代器:

 public class EnhancedIterator implements Iterator{ private List list; private int indexSelected=-1; public EnhancedIterator(List list){ this.list=list; } @Override public boolean hasNext() { return indexSelected