3

嗨,我正在使用 Iterator 遍历 a hashMap,调用后iterator.next()是否有任何方法可以取回上一个条目(我正在寻找类似的东西iterator.previous()

 Iterator iterator= hm.entrySet().iterator();
    Map.Entry entry = (Map.Entry) iterator.next();

现在我正在创建一个虚拟迭代器来指向上一个条目。有没有其他方法可以做到这一点?

4

7 回答 7

9

我不知道,但是您可以将其存储在局部变量中,以便您可以在每次“下一次”迭代中访问。-

Iterator iterator = hm.entrySet().iterator();
Object prev = null;

while (iterator.hasNext()) {
    Object next = iterator.next();
    // Do your stuff
    prev = next;
}
于 2013-10-03T09:11:04.963 回答
3

ListIterator接口为您提供了一个 iterator.previous() 方法。但当然,您只能从列表中获取列表迭代器。因此,您可以执行以下操作:

ListIterator iterator = new ArrayList(hm.entrySet()).listIterator();
于 2013-10-03T09:13:03.823 回答
2

不幸的是,没有previous()提供方法,但是如果您需要访问迭代中的前一个元素,您可以轻松地将其保存在单独的变量中。

T previous = null;
Iterator<T> iterator = map.keySet().iterator()
while (iterator.hasNext()) {
    T next = iterator.next();
    //Do something with the next varable (hopefully it's not null)
    previous = next;
}
于 2013-10-03T09:11:16.800 回答
0

没有previous方法。然而,您可以保留对前一个对象的引用:

Object previous = null;
while(iterator.hasNext()) {
    Object current = iterator.next();
    // do work with "current"
    previous = current;
}
于 2013-10-03T09:11:51.933 回答
0

由于两个原因,无法访问前一个元素:

  1. 没有提供任何方法
  2. 用当前的 HashMap 实现来实现这样的方法是不可能/低效的:它将每个桶的条目存储在一个单链表中。需要一个双向链表以相反的顺序进行迭代。

您可以在此处从 openjdk 阅读地图源代码:http: //www.docjar.com/html/api/java/util/HashMap.java.html

于 2013-10-03T09:16:08.113 回答
0

代替迭代器使用 ListIterator

    import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class MyListIterator {
    public static void main(String a[]){
        List<Integer> li = new ArrayList<Integer>();
        ListIterator<Integer> litr = null;
        li.add(23);
        li.add(98);
        li.add(29);
        li.add(71);
        li.add(5);
        litr=li.listIterator();
        System.out.println("Elements in forward directiton");
        while(litr.hasNext()){
            System.out.println(litr.next());
        }
        System.out.println("Elements in backward directiton");
        while(litr.hasPrevious()){
            System.out.println(litr.previous());
        }
    }
}
于 2013-10-03T09:18:58.210 回答
0

使用 Iterator 时没有类似 iterator.previous() 的东西。或者,您可以使用 ListIterator。
或者
您可以引用前一个元素。前任-

 Object previousItem;  
    while(iterator.hasNext()) {  
     Object obj=iterator.next();  
     previousItem=obj;  
    } 
于 2013-10-03T09:25:57.360 回答