我有一个在HashMap上使用的迭代器,我保存并加载迭代器。 有没有办法用Iterator获取HashMap中的上一个键? (java.util.Iterator的)
我将它保存为Red5连接中的属性,然后将其加载以继续工作,直到我停止。
我正在遍历HashMap的键集
答案 0 :(得分:28)
您可以使用ListIterator
代替Iterator
。
ListIterator具有previous()
和hasPrevious()
方法。
答案 1 :(得分:14)
不像其他人指出的那样直接,但如果你是需要访问前一个元素,您可以轻松地将其保存在单独的变量中。
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;
}
答案 2 :(得分:14)
听起来您希望数组语义更类似于ListIterator,而不是Iterator接口提供的语义。获取此类内容的最简单方法是构建一个列表(来自键集(LinkedList<K> keyList = new LinkedList<K>(map.keySet())
),然后手动使用ListIterator而不是常规Iterator或foreach。
对于需要记住连续项的非常简单的情况,处理此问题的最简单方法是将前一个Key存储在局部变量中,并在循环结束时更新它。
答案 3 :(得分:3)
答案 4 :(得分:1)
正如其他人所说,您只能使用next()
访问元素。然而,它的类是一个术语问题。致电next()
后, 当前元素。
除非问题是你需要在每次迭代中看到集合中的两个连续项,在这种情况下,一个简单的变量看起来最简单。
答案 5 :(得分:1)
虽然Set
没有为反向迭代器提供方法,但Deque
确实如此。对于反向顺序中的迭代器和descendingIterator()
,可以使用iterator()
作为转发顺序中的迭代器。
(您可以Deque
通过Set
创建Deque<T> deque = new LinkedList<T>(set)
,其中set
是您的Set
和T
通用类型'正在使用。)
答案 6 :(得分:1)
最终Iterator
并不完全适合您的任务。
为什么不从List
创建Set
(例如,通过List list = new LinkedList(set)
)并使用标准的索引for循环进行迭代?这样您就知道前一个元素位于i - 1
。
答案 7 :(得分:0)
使用迭代器,不,你没有选项来获取以前的键值。它只有hasNext()和next()方法。
答案 8 :(得分:0)
但你可以做的是 - 有点垃圾 - 创建一个List<Entry<Integer, YourObjectType>>
,其中Integer
- 值代表密钥对象的哈希码。然后你可以做这样的事情:
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
}
我知道这很垃圾,但有可能
答案 9 :(得分:0)
制作自己的迭代器:
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);
}
}