LinkedHashMapのことに同意します。HashMapをキーで並べ替えようとしたときに問題に直面しているときに、調査結果と経験を入力するだけです。
HashMapを作成するための私のコード:
HashMap<Integer, String> map;
@Before
public void initData() {
map = new HashMap<>();
map.put(55, "John");
map.put(22, "Apple");
map.put(66, "Earl");
map.put(77, "Pearl");
map.put(12, "George");
map.put(6, "Rocky");
}
マップのエントリを出力する関数showMapがあります。
public void showMap (Map<Integer, String> map1) {
for (Map.Entry<Integer, String> entry: map1.entrySet()) {
System.out.println("[Key: "+entry.getKey()+ " , "+"Value: "+entry.getValue() +"] ");
}
}
並べ替える前に地図を印刷すると、次の順序で印刷されます。
Map before sorting :
[Key: 66 , Value: Earl]
[Key: 22 , Value: Apple]
[Key: 6 , Value: Rocky]
[Key: 55 , Value: John]
[Key: 12 , Value: George]
[Key: 77 , Value: Pearl]
これは基本的に、マップキーが配置された順序とは異なります。
マップキーで並べ替えると、次のようになります。
List<Map.Entry<Integer, String>> entries = new ArrayList<>(map.entrySet());
Collections.sort(entries, new Comparator<Entry<Integer, String>>() {
@Override
public int compare(Entry<Integer, String> o1, Entry<Integer, String> o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
HashMap<Integer, String> sortedMap = new LinkedHashMap<>();
for (Map.Entry<Integer, String> entry : entries) {
System.out.println("Putting key:"+entry.getKey());
sortedMap.put(entry.getKey(), entry.getValue());
}
System.out.println("Map after sorting:");
showMap(sortedMap);
出力は次のとおりです。
Sorting by keys :
Putting key:6
Putting key:12
Putting key:22
Putting key:55
Putting key:66
Putting key:77
Map after sorting:
[Key: 66 , Value: Earl]
[Key: 6 , Value: Rocky]
[Key: 22 , Value: Apple]
[Key: 55 , Value: John]
[Key: 12 , Value: George]
[Key: 77 , Value: Pearl]
キーの順序の違いを確認できます。キーの並べ替え順序は問題ありませんが、コピーされたマップのキーの順序は、以前のマップと同じ順序になります。これが正しいかどうかはわかりませんが、同じキーを持つ2つのハッシュマップの場合、キーの順序は同じです。これは、キーの順序は保証されていませんが、このJVMバージョンのHashMap実装の場合、キー挿入アルゴリズムの固有の性質により、同じキーを持つ2つのマップで同じになる可能性があることを意味します。
LinkedHashMapを使用してソートされたエントリをHashMapにコピーすると、目的の結果が得られます(これは自然なことですが、それは重要ではありません。重要なのはHashMapのキーの順序です)。
HashMap<Integer, String> sortedMap = new LinkedHashMap<>();
for (Map.Entry<Integer, String> entry : entries) {
System.out.println("Putting key:"+entry.getKey());
sortedMap.put(entry.getKey(), entry.getValue());
}
System.out.println("Map after sorting:");
showMap(sortedMap);
出力:
Sorting by keys :
Putting key:6
Putting key:12
Putting key:22
Putting key:55
Putting key:66
Putting key:77
Map after sorting:
[Key: 6 , Value: Rocky]
[Key: 12 , Value: George]
[Key: 22 , Value: Apple]
[Key: 55 , Value: John]
[Key: 66 , Value: Earl]
[Key: 77 , Value: Pearl]