値またはキーを反復処理すると、それらは相関しますか? 2 番目のキーは 2 番目の値にマップされますか?
9 に答える
いいえ、必ずしもそうではありません。この目的には、本当に entrySet().iterator() を使用する必要があります。この反復子を使用すると、Map 内のすべての Map.Entry オブジェクトを調べて、各キーと関連する値にアクセスできます。
@Cuchullainが言及したentrySetを使用するには:
Map<String, String> map = new HashMap<String, String>();
// populate hashmap
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// your code here
}
これ、LinkedHashMapを、予測可能な反復順序に使用します
public class Test {
public static void main(String[] args) {
HashMap <String,String> hashmap = new HashMap<String,String>();
hashmap.put("one", "1");
hashmap.put("two", "2");
hashmap.put("three", "3");
hashmap.put("four", "4");
hashmap.put("five", "5");
hashmap.put("six", "6");
Iterator <String> keyIterator = hashmap.keySet().iterator();
Iterator <String> valueIterator = hashmap.values().iterator();
while(keyIterator.hasNext()) {
System.out.println("key: "+keyIterator.next());
}
while(valueIterator.hasNext()) {
System.out.println("value: "+valueIterator.next());
}
}
}
key: two
key: five
key: one
key: three
key: four
key: six
value: 2
value: 5
value: 1
value: 3
value: 4
value: 6
values() と keySet() は両方とも entrySet() イテレーターに委任されるため、同じ順序で返されます。しかし、Alex が言うように、entrySet() イテレーターを直接使用する方がはるかに優れています。
pmac72に同意します。順序付けされていないコレクションから順序付けされた値またはキーを取得するとは限りません。それが時々機能する場合、それは純粋な危険です。順序を保持したい場合は、LinkedHashMap、TreeMap、またはcommonscollectionsOrderedMapを使用してください。
私は2番目の@basszeroです。その間
for (Map.Entry<Integer, Integer> entry : a.entrySet())
うまくいくでしょう、これを自動的に行うデータ構造を使用する方が良いと思います。これで、「通常」に繰り返すことができます
最初はこの質問に戸惑いましたが、@Matt が解決してくれました。
Map 上のキーと値のペアを含むセットを返す entrySet() メソッドの使用を検討してください。
Map<Integer, Integer> a = new HashMap<Integer, Integer>(2);
a.put(1, 2);
a.put(2, 3);
for (Map.Entry<Integer, Integer> entry : a.entrySet()) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
これは以下を出力します:
1 => 2
2 => 3
3 => 3
HashMap の keySet メソッドは、順序を保証しない Set を返します。
HashMap の values() メソッドはコレクションを返しますが、これは順序を保証しません。
とはいえ、質問は「それらは相関するか」だったので、技術的にはおそらく答えはありますが、それに依存しないでください。