2012-08-29 8 views
33

Làm cách nào để sắp xếp LinkedHashMap dựa trên các giá trị của nó khi LinkedHashMap chứa String và Integer. Vì vậy, tôi cần phải sắp xếp nó dựa trên các giá trị là số nguyên. Cảm ơn rất nhiềuSắp xếp LinkedHashMap

+2

Bạn phải sử dụng một LinkedHashMap? TreeMap có thể giúp bạn? – RNJ

+2

điều này có thể giúp http://stackoverflow.com/questions/780541/how-to-sort-hash-map – RNJ

+0

Ồ. Tôi hiểu rồi. Không bận tâm để đọc các ý kiến.^_^ – DankMemes

Trả lời

26

này bây giờ là khá một chút dễ dàng hơn với Java 8 dòng: bạn không cần bản đồ trung gian để sắp xếp:

map.entrySet().stream() 
    .sorted(Map.Entry.comparingByValue()) 
    .forEach(entry -> ...); 
4

LinkedHashMap chỉ duy trì thứ tự chèn. Nếu bạn muốn sắp xếp dựa trên giá trị, bạn có thể cần phải tự viết comparator của riêng mình.

+1

Brilliant, Có, Cảm ơn rất nhiều, tôi đã viết so sánh của riêng tôi – Ramin

+1

Tôi không nghĩ rằng bạn cần phải viết so sánh của riêng bạn. 'Map.Entry.comparingByValue()' sẽ tạo một cái cho bạn. Và nó có thể được đảo ngược bởi 'Collections.reverseOrder (Map.Entry.comparingByValue())'. – sprinter

+0

@sprinter: Nếu giá trị là loại của bất kỳ đối tượng tùy chỉnh nào? – kosa

66
List<Map.Entry<String, Integer>> entries = 
    new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() { 
    public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b){ 
    return a.getValue().compareTo(b.getValue()); 
    } 
}); 
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>(); 
for (Map.Entry<String, Integer> entry : entries) { 
    sortedMap.put(entry.getKey(), entry.getValue()); 
} 
+4

Thôi được, tôi đã viết đúng mã đó! :) Ngoại trừ phần cuối cùng, tôi không nghĩ rằng OP thực sự cần phải có chúng trở lại trong một bản đồ. –

+0

cảm ơn rất nhiều. đoạn mã rất hữu ích – Ramin

+0

Câu trả lời hay. Tôi đã phải sắp xếp theo thứ tự giảm dần như vậy, thêm một dấu hiệu -ve trong khi trả về giá trị từ Comparator. –

1
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.NavigableMap; 
import java.util.SortedMap; 
import java.util.TreeMap; 

public class HashMapTest { 

public static void main(String[] args) { 

    Map<String, Integer> map=new LinkedHashMap<String, Integer>(); 

    map.put("a", 11); 
    map.put("B", 12); 
    map.put("c", 3); 
    map.put("d", 4); 
    map.put("e", 5); 
    map.put("f", 6); 
    map.put("g", 7); 
    map.put("h", 8); 
    map.put("i", 9); 
    map.put("j", 3); 
    map.put("k", 2); 
    map.put("l", 1); 

    List<Map.Entry<String, Integer>> entries = new 
    ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 
      Collections.sort(entries,new CustomizedHashMap()); 


      Map<String, Integer> sortedMap = new LinkedHashMap<String, 
    Integer>(); 
      for (Map.Entry<String, Integer> entry : entries) { 
       sortedMap.put(entry.getKey(), entry.getValue()); 
       System.out.print(sortedMap.put(entry.getKey(), 
      entry.getValue())+" "); 
      } 
    } 
    } 

class CustomizedHashMap implements Comparator<Map.Entry<String, Integer>> { 

    @Override 
    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 
    // TODO Auto-generated method stub 
    return -o1.getValue().compareTo(o2.getValue()); 
    } 

}