3

こんにちは、Iterator を使用して を反復処理していますhashMap。呼び出した後iterator.next()、前のエントリを取得する方法はありますか (次のようなものを探していますiterator.previous()) 。

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

今のところ、前のエントリを指すダミーの Iterator を作成しています。これを行う他の方法はありますか?

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

インターフェイスはListIteratoriterator.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

次の 2 つの理由により、前の要素にアクセスする方法はありません。

  1. メソッドは提供されていません
  2. このようなメソッドを実装することは、現在の HashMap 実装では不可能/非効率的です。各バケットのエントリを個別にリンクされたリストに格納します。逆の順序で反復するには、二重にリンクされたリストが必要になります。

ここでopenjdkからマップのソースコードを読むことができます: http://www.docjar.com/html/api/java/util/HashMap.java.html

于 2013-10-03T09:16:08.113 に答える
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

Iterator の代わりに 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 に答える