簡體   English   中英

從 HashMap 中,如何刪除 k 個具有最高值的元素(Java)?

[英]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

您的方法存在多個問題。

  • 遍歷值並在每次刪除后繼續查找最大值是非常低效的
  • 您不能通過從其條目集的 forEach 循環中調用 remove 方法來修改源 map。

相反,獲取與 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM