保持最大的地图值?

时间:2014-08-02 02:20:01

标签: java collections

我有一张Map,我试图只保留n个最高值,然后将这些值放在一个列表中(或者,如果可能的话,删除地图中的其他所有内容)。

这是我到目前为止所尝试过的,但它没有用。它不仅限于n个值。

 double[] array = new double[n];
 List <String> finalwords= new ArrayList<String>();

    for(String word: map.keySet()){
        for(int i=0; i<array.length; i++){
            if(map.get(word) > array[i]){
                array[i] = map.get(word);
                break;
            }
        }
    }

    for(String word: map.keySet()){
        for(int i=0; i<array .length; i++){
            if(map.get(word)>= array[i]) {
                finalwords.add(word);
                break;
            }
        }
    }

感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:0)

我个人建议您使用TreeMap,它维护项目之间的顺序。当地图的大小超过容量时,我认为您可以从地图中删除最小的项目。

答案 1 :(得分:0)

如果要基于值而不是键进行排序,并且希望保留具有最高值的键值对,则可以使用entryList并使用自定义Comparator对其进行排序。在下面的示例中,我使用3来保留n。

    List<Map.Entry<String, Integer>> kv = new LinkedList<>(map.entrySet());
    Collections.sort(kv, new Comparator<Map.Entry<String, Integer>>() {
        public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
            return (o1.getValue().compareTo(o2.getValue()));
        }
    });

    for (Map.Entry<String,Integer> e: kv.subList(kv.size()-3, kv.size())) {
        System.out.println("e:" + e);
    }

答案 2 :(得分:0)

如果您使用的是Java 8,您还可以使用流来过滤地图,如下所示:

int max = 3; // Your limit 

// retainAll will remove entries where the key is not in the supplied set 
map.keySet().retainAll(                
    map.entrySet().stream()
        // Sort by values in descending order
        .sorted((a, b) -> b.getValue().compareTo(a.getValue()))      
        // Limit results and return set of keys
        .limit(max).map(a -> a.getKey()).collect(Collectors.toSet()) 
);