gpt4 book ai didi

Java Guava : Remove and put back elements from Multimap while iterating

转载 作者:行者123 更新时间:2023-11-29 05:43:35 25 4
gpt4 key购买 nike

我要实现的目标如下:同时遍历 Multimap<K,V> 的键和值。 ,我想从此列表中删除 并放回 元素。我尝试过的任何方法都以 ConcurrentModificationException 告终。实现回溯搜索需要这种移除并放回方法(参见此处:Implementing a backtrack search with heuristic?)

这可能看起来像:

Multimap<K,V> multimap = HashMultimap.create();
Iterator keyIterator = multimap.keySet().iterator();

while(keyIterator.hasNext()) {
K key = keyIterator.next();
Collection values = multimap.get(key);

Iterator valueIterator = values.iterator();
while(valueIterator.hasNext()) {
V myValue = valueIterator.next();
if(special) {
valueIterator.remove();
keyIterator.remove();
// recursion
// put back Collection with key but without myValue <-- HOW?
}
}
}

最佳答案

一个解决方案是迭代 keySet 的副本,例如

K[] array = multiMap.keySet().toArray(new K[0]);
for(int i = 0; i < array.length; i++) {
K key = array[i];
...
}

对底层映射的更改不会反射(reflect)在 array 中,因此如果您使用 Iterator,您将不会得到 ConcurrentModificationException在它上面,如果你用 for 循环迭代它,你不会得到任何奇怪的行为。

另一种选择是将 MultiMap 的源代码复制并粘贴到新集合 MyMultiMap 中,除了您要替换顶级 HashMapConcurrentHashMap - 后者的迭代器不会抛出 ConcurrentModificationExceptions

另一种选择是将两个循环合并为一个循环,并直接遍历 map 的 entries - 这样你就只有一个迭代器,所以你不会有一个问题在第二个迭代器中导致 ConcurrentModificationExceptions 的迭代器。

关于Java Guava : Remove and put back elements from Multimap while iterating,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16633985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com