Tôi đồng ý với điều LinkedHashMap. Chỉ đưa những phát hiện và kinh nghiệm của tôi trong khi tôi đang đối mặt với vấn đề khi tôi đang cố gắng sắp xếp HashMap theo các khóa.
Mã của tôi để tạo 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");
}
Tôi có một hàm showMap in các mục của bản đồ:
public void showMap (Map<Integer, String> map1) {
for (Map.Entry<Integer, String> entry: map1.entrySet()) {
System.out.println("[Key: "+entry.getKey()+ " , "+"Value: "+entry.getValue() +"] ");
}
}
Bây giờ khi tôi in bản đồ trước khi sắp xếp, nó sẽ in chuỗi sau:
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]
Về cơ bản khác với thứ tự đặt các phím bản đồ.
Bây giờ Khi tôi sắp xếp nó bằng các phím bản đồ:
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);
đặt ra là:
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]
Bạn có thể thấy sự khác biệt về thứ tự của các phím. Thứ tự các phím được sắp xếp là ổn nhưng các phím của bản đồ được sao chép lại theo cùng thứ tự của bản đồ trước đó. Tôi không biết liệu điều này có hợp lệ để nói hay không, nhưng đối với hai bản đồ băm có các khóa giống nhau, thứ tự các khóa giống nhau. Điều này ngụ ý tuyên bố rằng thứ tự các khóa không được đảm bảo nhưng có thể giống nhau đối với hai bản đồ có cùng khóa vì bản chất vốn có của thuật toán chèn khóa nếu HashMap triển khai phiên bản JVM này.
Bây giờ khi tôi sử dụng LinkedHashMap để sao chép các Mục nhập được sắp xếp vào HashMap, tôi nhận được kết quả mong muốn (điều này là tự nhiên, nhưng đó không phải là vấn đề. Điểm liên quan đến thứ tự các khóa của 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);
Đầu ra:
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]