37

文字列配列要素は、文字列配列の要素がキーであり、単語の頻度が値であるマップです。例:

String[] args = {"if","it","is","to","be","it","is","up","me","to","delegate"};

次に、マップには次のようなエントリがあります[ if:1, it:2 .... ]

Set<String> keys = m.keySet();
System.out.println("keyset of the map : "+keys);

すべてのキーを出力します。"if","it","is","to","be","it","is","up","me","to","delegate"

Set<Map.Entry<String, Integer>> entrySet = m.entrySet();
Iterator<Map.Entry<String, Integer>> i = entrySet.iterator();
while(i.hasNext()){
    Map.Entry<String, Integer> element = i.next();
    System.out.println("Key: "+element.getKey()+" ,value: "+element.getValue());
}

すべてのキー値のペアを出力します:

エントリセットを使用すると、すべての値が出力されます。

Key: if ,value: 1
Key: it ,value: 2
Key: is ,value: 2
Key: to ,value: 2
Key: be ,value: 1
Key: up ,value: 1
Key: me ,value: 1
Key: delegate ,value: 1

ただし、以下のコードブロックは、上記とまったく同じ出力を出力する必要がありますが、そうではありません。

Iterator<String> itr2 = keys.iterator();
while(itr2.hasNext()){
    //System.out.println(itr1.next()+" ");
    //System.out.println(m.get(itr1.next())+" ");
    System.out.println("Key: "+itr2.next()+" ,value: "+m.get(itr2.next()));
}

それは印刷します:

Key: if ,value: 2
Key: is ,value: 2
Key: be ,value: 1
Key: me ,value: 1

しかし、whileループの1行目のコメントを外すと

System.out.println(itr1.next()+" ");

行にコメントします

System.out.println("Key: "+itr2.next()+" ,value: "+m.get(itr2.next()));

次に、すべてのキーを取得します。{"if","it","is","to","be","it","is","up","me","to","delegate"};

m.get()と一緒に使用する場合itr2.next()、イテレータにはいくつかのキーがありません。

4

5 に答える 5

53

を呼び出すたびにIterator.next()、イテレータが次の要素に移動します。現在の要素を複数のステートメントまたは式で使用する場合は、ローカル変数に格納する必要があります。または、さらに良いことに、単純にfor-eachループを使用してみませんか?

for (String key : map.keySet()) {
    System.out.println(key + ":" + map.get(key));
}

さらに、キーごとにマップを2回クエリしないため、entrySetのループが高速になります。またMap.Entry、実装は通常toString()メソッドを実装するため、キーと値のペアを手動で出力する必要はありません。

for (Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry);
}
于 2012-01-22T16:36:07.203 に答える
3

itr2.next()を呼び出すたびに、明確な値が得られます。同じ値ではありません。これは、ループ内で1回だけ呼び出す必要があります。

Iterator<String> itr2 = keys.iterator();
    while(itr2.hasNext()){
        String v = itr2.next();
        System.out.println("Key: "+v+" ,value: "+m.get(v));
    }
于 2012-01-22T16:17:07.220 に答える
2

大きな地図を横断するentrySet()方が、よりもはるかに優れていkeySet()ます。このチュートリアルで、entrySet()を使用して大きなオブジェクトのトラバーサルを最適化する方法と、パフォーマンスの調整にどのように役立つかを確認してください。

于 2014-03-11T05:07:42.157 に答える
1

前進するIteratorだけで、一度読んだら完了です。あなたの

m.get(itr2.next());

は、の次の値を読み取っていitr2.next();ます。そのため、いくつかの(実際には、他のすべての)キーが欠落しています。

于 2012-01-22T16:14:51.493 に答える
0

簡単にするために、ポインタを実行するたびitr2.next()に次の要素に移動することに注意してください。つまり、注意深く気付くと、出力は作成したロジックに従って完全に正常になります。
これは、理解を深めるのに役立つ場合があります。

Whileループの1回目の反復(ポインターは1番目の要素の前にあります):
キー:if、value:2 {itr2.next()=if; m.get(itr2.next()=it)=>2}

Whileループの2回目の反復(ポインターは3番目の要素の前にあります):
キー:は、値:2{itr2.next()=is; m.get(itr2.next()=to)=>2}

Whileループの3回目の反復(ポインターは5番目の要素の前にあります):
キー:be、値:1{itr2.next()="be"; m.get(itr2.next()="up")=>"1"}

Whileループの4回目の反復(ポインターは7番目の要素の前にあります):
キー:me、値:1{itr2.next()="me"; m.get(itr2.next()="delegate")=>"1"}

キー:if、value:1
キー:it、value:2
キー:is、value:2
キー:to、value:2
キー:be、value:1
キー:up、value:1
キー:me、value:1
キー:デリゲート、値:1

それは印刷します:

キー:if、value:2
キー:is、value:2
キー:be、value:1
キー:me、value:1

于 2016-12-07T07:22:07.820 に答える