Java 保持最大的映射值?
我有一个映射,我试图只保留n个最高值,然后将这些值放在一个列表中(或者,如果可能的话,从映射中删除所有其他值) 这是我到目前为止尝试过的,但它不起作用。它不仅限于n个值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
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个单词的原因