2012-09-05 13 views
12

Map.keySetとMap.valuesで同じ繰り返し順序ですか?以下のようなマップの

Map<Integer, Integer> map = ...; 
map.put(1, 1); 
map.put(2, 2); 
map.put(3, 3); 
map.put(4, 4); 

このコードは...

for (Integer i : map.keySet()) System.out.println(i); 
for (Integer i : map.values()) System.out.println(i); 

...保証プリント二度同じ同じシーケンス?

もしそうでない場合は、例えばjava.util.HashMapに何らかの保証がありますか?

+0

[Java HashMapのkeySet()反復順序は一貫していますか?](http://stackoverflow.com/questions/1882762/is-the-java-hashmap-keyset-iteration-order-consistent) – assylias

+0

@ assylias:この質問はキーセットと値の関係です。 – dacwe

+0

@daxweはあなたの質問です:2回呼び出された場合、または2回呼び出された場合、2つのループは同じことを表示しますか?キーの上のループと値の上の対応するキー/値が同じ順序で出力されますか? – assylias

答えて

16

いいえ、実際には起こりますが(キーと値に対して異なるイテレータを使用する理由はありません)。

あなたが反復順序を保証したい場合は、反復処理entrySet()

for (Map.Entry<Integer,Integer> entry : map.entrySet()) 
    // ... 

あなたが再ハッシュmapbeingの結果として、およそHashMap、ノートは、マップへの変更は、潜在的に反復順序を変更することをお願いしているので。

+0

良い代替、おかげでたくさん:) – Luvie

+0

私は[Map javadoc](https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#entrySet--)と'entrySet()'に対する順序保証はありません。あなたはどこからそれを手に入れましたか? – Roland

7

いいえ、保証されません。 1つはSetであり、1つはCollectionであり、順序を保証するものではありません。

ご注文をご希望の場合は、 LinkedHashMap()entrySet()が役立つ場合があります。

+1

+1注文した場合でも、同じ注文を保証するものではありません。 ;) –

-1

はい。並べ替えSortedMapのサブクラス、つまりTreeMapを使用できます。それは自然な順序で鍵を保持します。 (または、特定の比較器を与えることができます)。しかし、ツリーマップを使用する場合は、compareToメソッドが "equalsと一貫していなければならない"ことを確認する必要があります。詳細はjavadocを読んでください。しかし要するに、地図をソートできます。

+0

質問はあなたがマップを並べ替えることができるかどうかではなく、 'keySet()'から返されたキーのセットと 'valueSet()'から返された値のセットが順序付けられてn番目のキーキーセット内の値は、値セットのn番目の値に対応します。そのような保証はありません。キーと値が 'keySet()'と 'valueSet()'から返される順序が2回の連続した呼び出しでも同じであるという保証はありません。 – JHH