[英]From a HashMap, how to remove k number of elements with the highest values(Java)?
myMap = {1=3, 2=2, 3=6, 4=8, 5=2, 6=1}
k = 3
所以我將刪除具有最高值的 (3) 個最高的 map 項。
我可以在 Java 中做什么,這樣 map 就變成了?
myMap = {2=2, 5=2, 6=1}
我嘗試了一個迭代 (3) 次的 for 循環
在其中,嵌套的 for 循環使用 map.entry 獲取最大值並將其刪除。 我不斷收到錯誤消息。
int k =3; // number of large value pairs to remove
int max = Collections.max(myMap.values()); // find max value
for(int i =0; i<k ;i++) { // iterate 3 times to delete (3) sets
for (Map.Entry<Integer, Integer> entry : myMap.entrySet()) {
Integer key = entry.getKey(); // find key associated with current largest value
Integer value = entry.getValue();// find largest value
if(value==max) { // test retrieved vale with max value
hMap.remove(key);// remove set from HashMap
}
max = Collections.max(myMap.values()); // find new maximum
}
}
錯誤:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:XXXX)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:XXXX)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:XXXX)
form jdk17 myMap.entrySet() -> hashMap's implements 它將創建一個新的 EntryIterator() object,然后將使用 super class HashIterator 的構造函數而不使用 arguments,當您使用 hashMap 的 put() 或 remove() 方法時,modCount 將 + 1,As結果 HashIterator 的 nextNode() enter image description here
您的方法存在多個問題。
相反,獲取與 map 中前k個值對應的鍵,並在每個鍵上調用 map 上的remove方法,如下所示。
Map<Integer, Integer> map = new HashMap<>(Map.of(1, 3, 2, 2, 3, 6, 4, 8, 5, 2, 6, 1));
int k = 3;
map.entrySet().stream().sorted((e1, e2) -> Integer.compare(e2.getValue(), e1.getValue())).map(e -> e.getKey())
.limit(k).forEach(map::remove);
System.out.println(map);
打印:{2=2, 5=2, 6=1}
使用for(element e: list)
循環使用地圖條目集的迭代器。 這個迭代器一次只能存在一次。 這個問題可以通過使用傳統for
循環來解決: for (int i = 0; i < myMap.entrySet().size(); i++)
或類似的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.