Câu trả lời ngắn
Sử dụng a TreeMap
. Đây chính xác là những gì nó làm.
Nếu bản đồ này được chuyển cho bạn và bạn không thể xác định loại, thì bạn có thể làm như sau:
SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) {
String value = map.get(key);
// do something
}
Điều này sẽ lặp đi lặp lại trên bản đồ theo thứ tự tự nhiên của các phím.
Câu trả lời dài hơn
Về mặt kỹ thuật, bạn có thể sử dụng bất cứ thứ gì thực hiện SortedMap
, nhưng ngoại trừ những trường hợp hiếm hoi, số tiền này tương đương với TreeMap
việc sử dụng một Map
triển khai thường lên tới HashMap
.
Đối với trường hợp khóa của bạn là loại phức tạp không triển khai Có thể so sánh hoặc bạn không muốn sử dụng thứ tự tự nhiên sau đó TreeMap
và TreeSet
có các hàm tạo bổ sung cho phép bạn chuyển qua Comparator
:
// placed inline for the demonstration, but doesn't have to be a lambda expression
Comparator<Foo> comparator = (Foo o1, Foo o2) -> {
...
}
SortedSet<Foo> keys = new TreeSet<>(comparator);
keys.addAll(map.keySet());
Hãy nhớ khi sử dụng một TreeMap
hoặc TreeSet
nó sẽ có các đặc tính hiệu suất khác với HashMap
hoặc HashSet
. Nói một cách đơn giản là các hoạt động tìm hoặc chèn một phần tử sẽ đi từ O (1) đến O (Nhật ký (N)) .
Trong một HashMap
, việc chuyển từ 1000 mục thành 10.000 không thực sự ảnh hưởng đến thời gian của bạn để tra cứu một yếu tố, nhưng trong TreeMap
thời gian tra cứu sẽ chậm hơn khoảng 3 lần (giả sử Nhật ký 2 ). Di chuyển từ 1000 đến 100.000 sẽ chậm hơn khoảng 6 lần cho mỗi lần tra cứu phần tử.