Get top 10 values in hash map
我试图找出如何从
我想仍然能够知道哪些键具有最高值,地图的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class Testing { public static void main(String[] args) { HashMap<String,Double> map = new HashMap<String,Double>(); ValueComparator bvc = new ValueComparator(map); TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc); map.put("A",99.5); map.put("B",67.4); map.put("C",67.4); map.put("D",67.3); System.out.println("unsorted map:"+map); sorted_map.putAll(map); System.out.println("results:"+sorted_map); } } class ValueComparator implements Comparator<String> { Map<String, Double> base; public ValueComparator(Map<String, Double> base) { this.base = base; } // Note: this comparator imposes orderings that are inconsistent with equals. public int compare(String a, String b) { if (base.get(a) >= base.get(b)) { return -1; } else { return 1; } // returning 0 would merge keys } } |
也许您应该将
然后,您可以创建所有值的数组列表:
1 2 3 | List<YourValueType> l = new ArrayList<YourValueType>(hashmap.values()); Collection.sort(l); l = l.subList(0,10); |
问候
我的答案来自于sk2212
首先,您需要实现降序比较器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class EntryComparator implements Comparator<Entry<String,Integer>> { /** * Implements descending order. */ @Override public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { if (o1.getValue() < o2.getValue()) { return 1; } else if (o1.getValue() > o2.getValue()) { return -1; } return 0; } } |
然后你可以在像这个属性"hashmap"这样的方法中使用它:
1 2 3 4 5 | public List<Entry<String,Integer>> getTopKeysWithOccurences(int top) { List<Entry<String,Integer>> results = new ArrayList<>(hashmap.entrySet()); Collections.sort(results, new EntryComparator()); return results.subList(0, top); } |
假设你有一个Map,但是这个例子适用于任何类型的
1 2 3 4 5 6 | Map<String, String> m = yourMethodToGetYourMap(); List<String> c = new ArrayList<String>(m.values()); Collections.sort(c); for(int i=0 ; i< 10; ++i) { System.out.println(i +" rank is" + c.get(i)); } |
如果您尝试获取地图的10个最高值(假设值是数字或至少实现Comparable),请尝试以下操作:
1 2 3 4 5 | List list = new ArrayList(hashMap.values()); Collections.sort(list); for(int i=0; i<10; i++) { // Deal with your value } |
恐怕你必须遍历整个地图。 堆是用于查找前K个元素的常用数据结构,如本书中所述。