Java 保持最大的映射值?

Java 保持最大的映射值?,java,collections,Java,Collections,我有一个映射,我试图只保留n个最高值,然后将这些值放在一个列表中(或者,如果可能的话,从映射中删除所有其他值) 这是我到目前为止尝试过的,但它不起作用。它不仅限于n个值 double[] array = new double[n]; List <String> finalwords= new ArrayList<String>(); for(String word: map.keySet()){ for(int i=0; i<array

我有一个映射,我试图只保留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;
            }
        }
    }
double[]数组=新的double[n];
List finalwords=new ArrayList();
for(字符串字:map.keySet()){
for(int i=0;i数组[i]){
数组[i]=map.get(word);
打破
}
}
}
for(字符串字:map.keySet()){
for(int i=0;i=array[i]){
添加(单词);
打破
}
}
}

感谢您的帮助,谢谢

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

如果希望基于值而不是键进行排序,并且希望保留具有最高值的键值对,则可以获取entryList并使用自定义比较器对其进行排序。在下面的例子中,我用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);
    }
List kv=newlinkedlist(map.entrySet());
Collections.sort(kv,新比较器(){
公共整数比较(Map.Entry o1,Map.Entry o2){
返回(o1.getValue().compareTo(o2.getValue());
}
});
对于(Map.Entry e:kv.subList(kv.size()-3,kv.size())){
System.out.println(“e:+e”);
}

如果您使用的是Java 8,也可以使用streams来过滤映射,如下所示:

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()) 
);

我甚至无法理解这段代码应该做什么,但可以肯定的是,它与您在问题中试图描述的相去甚远好吧,我终于明白了您的意图,为什么您认为它应该工作?这个算法至少有两个大问题:1。您存储的最大N值是错误的,请编写几个单元测试来证明这一点。如果几个单词具有相同的值-所有单词都将被添加,这就是为什么您有超过N个单词的原因