2012-10-18 37 views
19

Tôi cần một bộ so sánh cho TreeMap. Tôi có nên viết nặc danh này trong hàm tạo cho TreeMap của tôi không? Làm thế nào khác tôi có thể viết so sánh của tôi. Hiện nay, Java không thích mã của tôi (tôi có thể làm điều này một cách ẩn danh?):Java TreeMap Comparator

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<Entry<String, Double>>() 
    { 
     public int compare(Entry<String, Double> o1, Entry<String, Double> o2) 
     { 
      return o1.getValue().compareTo(o2.getValue()); 
     } 
    }); 
  1. Tôi có thể làm các việc trên nặc danh?
  2. Tôi có thể làm điều này bằng cách nào khác?
  3. Tôi muốn sắp xếp myMap bởi giá trị không phải là chính

Trả lời

42

Bạn không thể sắp xếp TreeMap trên giá trị.

Thực thi NavigableMap dựa trên cây đỏ đen. Bản đồ được sắp xếp theo thứ tự tự nhiên của khóa của nó, hoặc bằng một Comparator được cung cấp tại thời điểm tạo bản đồ, tùy thuộc vào nhà xây dựng nào được sử dụng Bạn sẽ cần phải cung cấp comparator cho Comparator<? super K> để so sánh của bạn nên so sánh trên các phím.

Để cung cấp sắp xếp các giá trị bạn cần SortedSet. Sử dụng

SortedSet<Map.Entry<String, Double>> sortedset = new TreeSet<Map.Entry<String, Double>>(
      new Comparator<Map.Entry<String, Double>>() { 
       @Override 
       public int compare(Map.Entry<String, Double> e1, 
         Map.Entry<String, Double> e2) { 
        return e1.getValue().compareTo(e2.getValue()); 
       } 
      }); 

    sortedset.addAll(myMap.entrySet()); 

Để cung cấp cho bạn một ví dụ

SortedMap<String, Double> myMap = new TreeMap<String, Double>(); 
    myMap.put("a", 10.0); 
    myMap.put("b", 9.0); 
    myMap.put("c", 11.0); 
    myMap.put("d", 2.0); 
    sortedset.addAll(myMap.entrySet()); 
    System.out.println(sortedset); 

Output:

[d=2.0, b=9.0, a=10.0, c=11.0] 
+0

Tôi làm cách nào để thêm từng phần tử vào myMap? myMap.add (Map.Entry new Map.Entry (vStr, cur)); – CodeKingPlusPlus

+0

@CodeKingPlusPlus Không. Bạn chỉ sử dụng phương thức đặt Kiểm tra ví dụ được thêm vào. Bạn đặt các giá trị vào Map khi bạn đã sử dụng xong SortedSet để sắp xếp các giá trị. –

+0

@AmitDeshpande cảm ơn cho câu trả lời tuyệt vời – Kushal

11

Các so sánh nên chỉ cho chìa khóa, không cho cả nhập cảnh. Nó sắp xếp các mục dựa trên các phím.

Bạn nên thay đổi nó một cái gì đó như sau

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<String>() 
    { 
     public int compare(String o1, String o2) 
     { 
      return o1.compareTo(o2); 
     } 
}); 

Cập nhật

Bạn có thể làm một cái gì đó như sau (tạo ra một danh sách các mục trong bản đồ và sắp xếp danh sách dựa trên giá trị, nhưng lưu ý rằng điều này sẽ không tự sắp xếp bản đồ) -

List<Map.Entry<String, Double>> entryList = new ArrayList<Map.Entry<String, Double>>(myMap.entrySet()); 
    Collections.sort(entryList, new Comparator<Map.Entry<String, Double>>() { 
     @Override 
     public int compare(Entry<String, Double> o1, Entry<String, Double> o2) { 
      return o1.getValue().compareTo(o2.getValue()); 
     } 
    }); 
+0

@CodeKingPlusPlus: Bạn không thể tự sắp xếp bản đồ dựa trên giá trị. Nhưng bạn có thể lấy danh sách các mục nhập và sắp xếp nó. Nhưng sau đó nó có thể không có ý nghĩa để có một TreeMap, trừ khi bạn chuyển đổi khóa và giá trị. –

0

bạn có thể swipe chìa khóa và giá trị. Ví dụ:

 String[] k = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil"}; 
     int[] v = {341, 273, 278, 329, 445}; 
     TreeMap<Integer,String>a=new TreeMap(); 
     for (int i = 0; i < k.length; i++) 
      a.put(v[i],k[i]);    
     System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey()); 
     a.remove(a.firstEntry().getKey()); 
     System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey()); 
+1

Điều này đang cố gắng giải quyết câu hỏi cuối cùng, nhưng không phải là câu hỏi đầu tiên. –

Các vấn đề liên quan