2015-06-15 82 views
0

如何使用鍵降序排列哈希映射。請用例子來解釋。 以及對散列圖進行排序的方式。 請詳細解釋如何使用鍵降序排列哈希映射

+0

可能重複[?如何排序在Java中值的地圖(http://stackoverflow.com/questions/109383/how-to-sort- map-value-in-the-value-in-java) – Lamorak

回答

4

HashMap s不支持排序。他們將存儲條目存儲在存儲桶中,他們如何看待它是否合適,僅基於密鑰的hashCode值。它們可以存儲事物並在事後查找,但是不適合迭代它們的內容(這是你顯然想要做的),因爲你不能依賴它們的順序並且迭代它通常是很昂貴的。

改爲嘗試TreeMap。您可以指定一個自定義比較器,它只執行默認比較器的反轉。在這種情況下,您的輸入將以降序訂購訂購。 Collections.reverseOrder將創建這樣一個比較適合你,你可以使用它像這樣:

new TreeMap<Integer, String>(Collections.reverseOrder()); 
-2
HashMap<Integer, String> hmap = new HashMap<Integer, String>(); 
     hmap.put(5, "A"); 
     hmap.put(11, "C"); 
     hmap.put(4, "Z"); 
     hmap.put(77, "Y"); 
     hmap.put(9, "P"); 
     hmap.put(66, "Q"); 
     hmap.put(0, "R"); 

     System.out.println("Before Sorting:"); 
     Set set = hmap.entrySet(); 
     Iterator iterator = set.iterator(); 
     while(iterator.hasNext()) { 
       Map.Entry me = (Map.Entry)iterator.next(); 
       System.out.print(me.getKey() + ": "); 
       System.out.println(me.getValue()); 
     } 
     Map<Integer, String> map = new TreeMap<Integer, String>(hmap); 
     System.out.println("After Sorting:"); 
     Set set2 = map.entrySet(); 
     Iterator iterator2 = set2.iterator(); 
     while(iterator2.hasNext()) { 
       Map.Entry me2 = (Map.Entry)iterator2.next(); 
       System.out.print(me2.getKey() + ": "); 
       System.out.println(me2.getValue()); 
     } 
    } 
+1

無需迭代映射來打印其內容,它的'toString'被重載以執行相同的操作,所以'System.out.println(hmap) ;'就夠了。另外,請不要使用原始類型(如'Set')。在這種情況下不需要使用迭代器,for-each循環會執行('for(Map.Entry me2:set2)')。 – mastov

+2

另外,OP要求*降序*順序。 – mastov

+2

此外,一點解釋比僅僅一整頁未註釋的代碼好得多。 – mastov

1

兩種方式來實現:

  1. 使用的HashMap

    public static void main(String[] args) { 
        Map<String, Integer> map = new HashMap<String, Integer>(); 
        map.put("A", 34); 
        map.put("B", 25); 
        map.put("C", 50); 
        map.put("D", 50); // "duplicate" value 
    
        System.out.println(entriesSortedByValues(map)); 
    } 
    
    static <K, V extends Comparable<? super V>> List<Entry<String, Integer>> entriesSortedByValues(Map<String, Integer> map) { 
    
        List<Entry<String, Integer>> sortedEntries = new ArrayList<Entry<String, Integer>>(map.entrySet()); 
    
        Collections.sort(sortedEntries, new Comparator<Entry<String, Integer>>() { 
         @Override 
         public int compare(Entry<String, Integer> e1, Entry<String, Integer> e2) { 
          return e2.getKey().compareTo(e1.getKey()); 
         } 
        }); 
    
        return sortedEntries; 
    } 
    
  2. 使用樹圖,書寫自己的Comparator

    public class Test2 { 
        public static void main(String[] args) { 
         Map<String, Integer> map = new HashMap<String, Integer>(); 
         map.put("A", 34); 
         map.put("B", 25); 
         map.put("C", 50); 
         map.put("D", 50); 
    
         MyComparator comp = new MyComparator(map); 
    
         Map<String, Integer> newMap = new TreeMap(comp); 
         newMap.putAll(map); 
         System.out.println(newMap); 
        } 
    } 
    
    class MyComparator implements Comparator { 
        Map map; 
    
         public MyComparator(Map map) { 
         this.map = map; 
        } 
    
        @Override 
        public int compare(Object o1, Object o2) { 
         return (o2.toString()).compareTo(o1.toString()); 
        } 
    } 
    
1

我建議使用此方法,因爲包含在Java的8

List<Map.Entry<String, Integer>> sorted_map = 
       map_1.entrySet() 
       .stream() 
       .sorted(reverseOrder(Map.Entry.comparingByKey())) 
       .collect(Collectors.toList()); 

這裏map_1'是要排序的地圖。

現在你可以使用sorted_map變量來迭代和使用你的目的。

確保:

import static java.util.Collections.reverseOrder;