HashMap
のkeySet()
で返されるキーの並び順が変わった
以下のソースをJava7、Java8それぞれで実行してみた。
Map#keySet
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
System.out.println("keySet: " + map.keySet());
Java7の実行結果
Java7実行
// 降順で返ってくる
keySet: [key3, key2, key1]
Java8の実行結果
Java8実行結果
// 昇順で返ってくる
keySet: [key1, key2, key3]
解決方法
ソートする
一度配列にしてソートする。
ソートする
String[] keyArray = map.keySet().toArray(new String[map.size()]);
// 降順
Arrays.sort(keyArray, Collections.reverseOrder());
// 昇順
Arrays.sort(keyArray);
そもそも
Set
に順序を期待してはいけない。
順序依存を期待したいのならSortedSet
を実装したコレクションクラスを利用すべき。
順序付きのMapを使いたいのであればTreeMap
を使う。
(@pocariさん、@tsuyoshi_choさんコメントありがとうございます)
HashMap
, TreeMap
, LinkedHashMap
のkeySet()
について
3つのMapそれぞれのkeySet()
の出力結果を見てみる。
それぞれのMapのkeySet()
HashMap<String,String> hashMap = new HashMap<String, String>();
hashMap.put("key1", "value1");
hashMap.put("key3", "value3");
hashMap.put("key2", "value2");
System.out.println("HashMap.keySet: " + hashMap.keySet());
TreeMap<String,String> treeMap = new TreeMap<String, String>();
treeMap.put("key1", "value1");
treeMap.put("key3", "value3");
treeMap.put("key2", "value2");
System.out.println("TreeMap.keySet: " + treeMap.keySet());
LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String, String>();
linkedHashMap.put("key1", "value1");
linkedHashMap.put("key3", "value3");
linkedHashMap.put("key2", "value2");
System.out.println("LinkedHashMap.keySet: " + linkedHashMap.keySet());
Java7の実行結果
Java7実行結果
// 降順(順序は不定)
HashMap.keySet: [key3, key2, key1]
// 昇順(順序付き)
TreeMap.keySet: [key1, key2, key3]
// 挿入順
LinkedHashMap.keySet: [key1, key3, key2]
Java8の実行結果
Java8実行結果
// 昇順(順序は不定)
HashMap.keySet: [key1, key2, key3]
// 昇順(順序付き)
TreeMap.keySet: [key1, key2, key3]
// 挿入順
LinkedHashMap.keySet: [key1, key3, key2]