迭代器有.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
而不是Iterator
。 hasPrevious()
具有previous()
和hasPrevious()
方法。
听起来您希望数组语义更类似于ListIterator而不是Iterator接口提供的那些。 获取此类内容的最简单方法是构造一个列表(来自键集( LinkedList
),然后手动使用ListIterator而不是常规迭代器或foreach。
对于需要记住连续项的非常简单的情况,处理此问题的最简单方法是将前一个Key存储在局部变量中并在循环结束时更新它。
不, Iterator
只定义了3种方法:
boolean hasNext() E next() void remove()
您当然可以实现自己的迭代器。
正如其他人所说,你只能使用next()
访问一个元素。 然而,这是一个术语问题。 一旦调用next()
这就是当前元素。
除非问题是你需要在每次迭代中看到集合中的两个连续项,在这种情况下,一个简单的变量看起来最简单。
虽然Set
没有提供反向迭代器的方法,但Deque
确实如此。 您可以使用descendingIterator()
以反向顺序使用迭代器,使用iterator()
,以迭代顺序使用迭代器。
(您可以通过Deque
从Set
创建Deque
,其中set
是您的Set
, T
是您正在使用的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