我有一张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;
}
}
}
感谢任何帮助,谢谢!
答案 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())
);