8

我试图弄清楚如何从HashMap. 我最初试图使用TreeMap并让它按值排序,然后取前 10 个值,但似乎这不是选项,TreeMap按键排序。

我希望仍然能够知道哪些键具有最高值,K, V地图的String, Integer.

4

6 回答 6

4

也许您应该Comparable为存储在哈希图中的值对象实现接口。然后您可以创建一个包含所有值的数组列表:

List<YourValueType> l = new ArrayList<YourValueType>(hashmap.values());
Collection.sort(l);
l = l.subList(0,10);

问候

于 2013-03-15T15:52:54.933 回答
3
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
    }
}
于 2013-03-15T15:57:39.523 回答
0

如果您尝试获取地图的 10 个最高值(假设这些值是数字或至少实现 Comparable),请尝试以下操作:

List list = new ArrayList(hashMap.values());
Collections.sort(list);
for(int i=0; i<10; i++) {
   // Deal with your value
}
于 2013-03-15T15:48:56.593 回答
0

假设您有一个地图,但这个示例适用于任何类型的

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)); 
}
于 2013-03-15T15:56:02.337 回答
0

恐怕您将不得不遍历整个地图。是一种常用的数据结构,用于查找前 K 个元素,如本书中所述。

于 2013-03-15T15:48:28.030 回答
0

我的答案来自sk2212

首先你需要实现一个降序比较器:

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”:

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);
}
于 2017-04-15T22:11:42.987 回答