上一个条目迭代器-Java

上一个条目迭代器-Java,java,Java,您好,我正在使用迭代器在调用Iterator.next()之后遍历hashMap,是否有方法返回上一个条目(我正在寻找类似Iterator.previous()) 现在,我正在创建一个虚拟迭代器来指向前面的条目。还有其他方法吗?我不知道,但可以将其存储在局部变量中,以便在每次“下一次”迭代中都可以访问- Iterator iterator = hm.entrySet().iterator(); Object prev = null; while (iterator.hasNext()) {

您好,我正在使用迭代器在调用
Iterator.next()
之后遍历
hashMap
,是否有方法返回上一个条目(我正在寻找类似
Iterator.previous()


现在,我正在创建一个虚拟迭代器来指向前面的条目。还有其他方法吗?

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

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

while (iterator.hasNext()) {
    Object next = iterator.next();
    // Do your stuff
    prev = next;
}

不幸的是,没有提供
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;
}
T previous=null;
迭代器迭代器=map.keySet().Iterator()
while(iterator.hasNext()){
T next=iterator.next();
//对下一个varable执行一些操作(希望它不是null)
上一个=下一个;
}

没有以前的
方法。但您可以保留对上一个对象的引用:

Object previous = null;
while(iterator.hasNext()) {
    Object current = iterator.next();
    // do work with "current"
    previous = current;
}

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

ListIterator iterator = new ArrayList(hm.entrySet()).listIterator();

由于以下两个原因,无法访问上一个元素:

  • 没有为此提供任何方法
  • 用当前的HashMap实现实现这种方法是不可能的/效率低下的:它将每个bucket的条目存储在一个单链表中。需要一个双链表以相反的顺序进行迭代
  • 您可以在此处阅读openjdk中的地图源代码:
    使用ListIterator代替Iterator

        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());
            }
        }
    }
    
    import java.util.ArrayList;
    导入java.util.List;
    导入java.util.ListIterator;
    公共类MyListerator{
    公共静态void main(字符串a[]{
    List li=new ArrayList();
    ListIterator litr=null;
    加(23);
    加(98);
    加(29);
    李.加(71);
    加上(5);
    litr=li.listIterator();
    System.out.println(“正向元件”);
    while(litr.hasNext()){
    System.out.println(litr.next());
    }
    System.out.println(“反向元素”);
    while(litr.hasPrevious()){
    System.out.println(litr.previous());
    }
    }
    }
    
    使用迭代器时没有类似迭代器.previous()的功能。或者,您可以使用ListIterator。

    您可以引用上一个元素。前

     Object previousItem;  
        while(iterator.hasNext()) {  
         Object obj=iterator.next();  
         previousItem=obj;  
        } 
    

    将其保存在单独的变量中
     Object previousItem;  
        while(iterator.hasNext()) {  
         Object obj=iterator.next();  
         previousItem=obj;  
        }