Sắp xếp hashmap dựa trên các khóa


79

Tôi có bản đồ băm sau trong java:

{B046 = 0.0, A061 = 3.0, A071 = 0.0, B085 = 0.0, B075 = 3.0, B076 = 9.0, B086 = 3.0, B095 = 0.0, B096 = 0.0, A052 = 0.0, B066 = 0.0, B056 = 9.0, B065 = 0,0, B055 = 9,0}

Tôi nên sắp xếp như thế nào về việc sắp xếp bản đồ băm sao cho Bảng chữ cái, theo sau là các số liệu được tính đến?

Bản đồ băm kết quả sẽ giống như sau:

{A052 = 0.0, A061 = 3.0, A071 = 0.0, B046 = 0.0, B055 = 9.0, B056 = 9.0, B065 = 0.0, B066 = 0.0, B075 = 3.0, B076 = 9.0, B085 = 0.0, B086 = 3.0, B095 = 0,0, B096 = 0,0}

Đánh giá cao sự giúp đỡ!


3
hashmap là để tra cứu. Nó băm mọi thứ. Nó không duy trì trật tự.
Muhammad Hasan Khan

2
@HasanKhan .. ai đã hỏi điều đó?
eRaisedToX

Câu trả lời:


239

Sử dụng được sắp xếp TreeMap:

Map<String, Float> map = new TreeMap<>(yourMap);

Nó sẽ tự động đặt các mục được sắp xếp theo các phím. Tôi nghĩ rằng Stringđặt hàng tự nhiên sẽ ổn trong trường hợp của bạn.

Lưu ý rằng HashMapdo tối ưu hóa tra cứu không bảo toàn thứ tự.


Xin chào @Tomasz Nurkiewicz Làm cách nào để nhận thứ tự ngược lại?
Raghavendra

Tôi có thể áp dụng so sánh của riêng tôi
Fakher

Giải pháp tuyệt vời! Có một xác suất có 2 chữ số không, việc sắp xếp trở thành 1, 10, 11,12,2,3,4,5. Có giải pháp nào cho điều này ?
Rachita Nanda

@RachitaNanda, Bạn có thể thử lưu trữ các chữ số bằng Số nguyên thay vì chuỗi.
Krishna

27

Sử dụng Bản đồ cây với bộ so sánh tùy chỉnh.

class MyComparator implements Comparator<String>
    {
        public int compare(String o1,String o2)
        {
            // Your logic for comparing the key strings
        }
    }

TreeMap<String, Float> tm = new TreeMap<String , Float>(new MyComparator());

Khi bạn thêm các phần tử mới, chúng sẽ tự động được sắp xếp.

Trong trường hợp của bạn, thậm chí có thể không cần triển khai bộ so sánh vì thứ tự chuỗi có thể là đủ. Nhưng nếu bạn muốn triển khai các trường hợp đặc biệt, chẳng hạn như chữ thường alpha xuất hiện trước chữ hoa hoặc xử lý các số theo cách nhất định, hãy sử dụng bộ so sánh.


11

TreeMaplà đặt cược tốt nhất của bạn cho loại sắp xếp này (Tự nhiên). TreeMapsắp xếp tự nhiên theo các phím.

HashMapkhông bảo toàn thứ tự chèn cũng như không sắp xếp bản đồ. LinkedHashMapgiữ thứ tự chèn nhưng không tự động sắp xếp bản đồ. Chỉ TreeMaptrong Mapgiao diện sắp xếp bản đồ theo thứ tự tự nhiên (chữ số đầu tiên, chữ cái viết hoa thứ hai, bảng chữ cái viết thường cuối cùng).


5

Sử dụng một TreeMap , mặc dù có một bản đồ "nhìn như thế" là một chút mơ hồ - bạn cũng có thể chỉ là loại chìa khóa dựa trên các tiêu chí và lặp của bạn trên bản đồ, lấy từng đối tượng.


3

Chỉ cần sử dụng a TreeMap. Nó thực hiện SortedMapgiao diện và do đó tự động sắp xếp các khóa mà nó chứa. Các khóa của bạn có thể được sắp xếp theo thứ tự bảng chữ cái để có được kết quả mong muốn, vì vậy bạn thậm chí không cần phải cung cấp một bộ so sánh.

HashMaps không bao giờ được sắp xếp. Điều duy nhất bạn coulkd làm với HashMap là lấy tất cả các khóa và lưu trữ chúng trong một tập hợp được sắp xếp hoặc trong một Danh sách và sắp xếp Danh sách.


3

Sử dụng TreeMap bạn có thể sắp xếp các bản đồ.

Map<String, String> map = new HashMap<String, String>();        
Map<String, String> treeMap = new TreeMap<String, String>(map);
//show hashmap after the sort
for (String str : treeMap.keySet()) {
    System.out.println(str);
}

3

Bạn có thể sử dụng TreeMapnó sẽ lưu trữ các giá trị ở dạng đã sắp xếp.

Map <String, String> map = new TreeMap <String, String>();

2

Sử dụng TreeMap (Constructor):

Map<String, Float> sortedMap = new TreeMap<>(yourMap);

Sử dụng TreeMap (phương thức PutAll):

Map<String, Float> sortedMap = new TreeMap<>();
sortedMap.putAll(yourMap);

Thực hiện giao diện Bản đồ:

  1. TreeMap - Tự động sắp xếp các khóa theo thứ tự tăng dần trong khi chèn.
  2. HashMap - Thứ tự chèn sẽ không được duy trì.
  3. LinkedHashMap - Thứ tự chèn sẽ được duy trì.

1

TreeMap sẽ tự động sắp xếp theo thứ tự tăng dần. Nếu bạn muốn sắp xếp theo thứ tự giảm dần, hãy sử dụng mã sau:

Sao chép mã bên dưới trong lớp của bạn và bên ngoài phương thức thực thi chính:

static class DescOrder implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {      
        return o2.compareTo(o1);
    }
    }

Sau đó, theo logic của bạn:

TreeMap<String, String> map = new TreeMap<String, String>(new DescOrder());
map.put("A", "test1");
map.put("C", "test3");
map.put("E", "test5");
map.put("B", "test2");
map.put("D", "test4");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.