如何在不获取ConcurrentModificationException的情况下从HashMap中删除元素

时间:2019-02-01 12:34:24

标签: java hashmap java-7 concurrentmodification

我正在将HashMap中的每个条目与同一HashMap中的所有其他条目进行比较。在迭代HashMap时,我根据某些条件删除了一些元素。但是我一直收到ConcurrentModificationException

    Iterator<Entry<String, String>> i = map.entrySet().iterator();

    while (i.hasNext()) {
        Entry<String, String> next = i.next();

        for (Entry<String,String> e : map.entrySet()) {

            if (e.getKey() != next.getKey()){                 
              String[] positions_e = fields_e[1].split("-");
              int start_e = Integer.parseInt(positions_e[0]);
              int end_e =  Integer.parseInt(positions_e[1]);

              String[] positions_next = fields_next[1].split("-");
              int start_next = Integer.parseInt(positions_next[0]);
              int end_next =  Integer.parseInt(positions_next[1]);

            if (start_e <= start_next || end_e <= end_next )) { 
                 i.remove();        
           } 

       }

   }

5 个答案:

答案 0 :(得分:1)

这里的方法不涉及第二个地图或列表,还可以提高代码的可读性:

提取在spearate方法您的条件:

private boolean myCondition(Entry<String, String> currentEntry, Map<String, String> map) {
    for (Entry<String, String> entry : map.entrySet()) {
        ...
        if (...) {
            return true;
        }

        return false;
    }
}

使用java8流根据您的条件过滤地图:

Map<String, String> filteredMap = map.entrySet().stream()
    .filter(entry -> myCondition(entry, map))
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

答案 1 :(得分:1)

有关代码的安全性,Java不允许你删除属于你的数据结构,而你迭代它的元素。这样做的一种方法是:克隆哈希图,遍历副本图并对其进行比较。如果条件表明必须删除某个元素,请尝试将其从原始哈希图中删除。

答案 2 :(得分:0)

您正在经由迭代i,而迭代在它与不同的迭代器,所述隐含一个通过您的foreach循环使用。

从集合中移除元件

如果您在同一集合上嵌套了迭代,并尝试从内部循环中删除项目,则总是会遇到此问题。使用内部或外部迭代器从集合中删除元素都会从另一个迭代器产生ConcurrentModificationException

由于您使用i要删除的元素,在这里最好的策略可能是break从内循环调用后remove

答案 3 :(得分:0)

在第二个循环中使用带有removeIf的迭代器或lambda。

for (Entry<String,String> e : map.entrySet()

地图迭代器:https://www.techiedelight.com/iterate-map-in-java-using-entryset/

LAMBDA在地图:https://javarevisited.blogspot.com/2017/08/how-to-remove-key-value-pairs-from-hashmap-java8-example.html#axzz5eHbDQxwp

答案 4 :(得分:0)

您可以保存所有的{{1}在keys,并删除任何键ArrayList您希望通过迭代到删除HashMap

ArrayList