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]
키 순서의 차이를 확인할 수 있습니다. 정렬 된 키 순서는 괜찮지 만 복사 된 맵의 키 순서는 이전 맵의 순서와 동일합니다. 이것이 유효한지 모르겠지만 동일한 키를 가진 두 개의 해시 맵의 경우 키 순서가 동일합니다. 이것은 키의 순서가 보장되지는 않지만이 JVM 버전의 HashMap이 구현 된 경우 키 삽입 알고리즘의 고유 한 특성으로 인해 동일한 키를 가진 두 개의 맵에 대해 동일 할 수 있음을 의미합니다.
이제 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]