关于java:获取哈希映射中的前10个值

Get top 10 values in hash map

我试图找出如何从HashMap获得前10个值。 我最初尝试使用TreeMap并按值排序,然后取前10个值,但似乎这不是选项,因为TreeMap按键排序。

我想仍然能够知道哪些键具有最高值,地图的K, VString, Integer


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
    }
}


也许您应该将Comparable接口实现为存储在hashmap中的值对象。
然后,您可以创建所有值的数组列表:

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个元素的常用数据结构,如本书中所述。