我正在将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();
}
}
}
答案 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/
答案 4 :(得分:0)
您可以保存所有的{{1}在keys
,并删除任何键ArrayList
您希望通过迭代到删除HashMap
ArrayList