2015-06-15 42 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;