在 Java 中迭代 Multiset,使用没有 ConcurrentModificationException 的 setcount()
Iterate on a Multiset in Java, use setcount() without ConcurrentModificationException
Multiset<String> ngrams = HashMultiset.create();
//added strings to the multiset...
for (Entry<String> entry : ngrams.entrySet()) {
if (entry.getCount() > 3) {
ngrams.setCount(terms, 3);
}
}
抛出 ConcurrentModificationException
如何在不抛出此异常的情况下使用 setCount()
?一些 Java 8 代码在这里有用吗?
如果 HashMultiset
中的元素计数为零,setCount(E, int)
只会抛出 ConcurrentModificationException
。
即如果 ngrams
已经包含 terms
那么改变 terms
计数将不会抛出 ConcurrentModificationException
.
例如您可以在迭代前使用特殊计数值(例如 Integer.MAX_VALUE
)添加 terms
,如果未更改,则在迭代后将其删除:
Multiset<String> ngrams = HashMultiset.create();
//added strings to the multiset...
ngrams.setCount(terms, Integer.MAX_VALUE);
for (Multiset.Entry<String> entry : ngrams.entrySet()) {
if (entry.getElement().equals(terms)) {
continue;
}
if (entry.getCount() > 3) {
ngrams.setCount(terms, 3);
}
}
if (ngrams.count(terms) == Integer.MAX_VALUE) {
ngrams.setCount(terms, 0);
}
如果您的情况更复杂,那么您最好创建一个新的 Multiset<String>
作为 Andy Turner ,而不是同时修改和迭代。 (或者其他一些不涉及并发迭代和修改等的解决方案)
Multiset<String> ngrams = HashMultiset.create();
//added strings to the multiset...
for (Entry<String> entry : ngrams.entrySet()) {
if (entry.getCount() > 3) {
ngrams.setCount(terms, 3);
}
}
抛出 ConcurrentModificationException
如何在不抛出此异常的情况下使用 setCount()
?一些 Java 8 代码在这里有用吗?
HashMultiset
中的元素计数为零,setCount(E, int)
只会抛出 ConcurrentModificationException
。
即如果 ngrams
已经包含 terms
那么改变 terms
计数将不会抛出 ConcurrentModificationException
.
例如您可以在迭代前使用特殊计数值(例如 Integer.MAX_VALUE
)添加 terms
,如果未更改,则在迭代后将其删除:
Multiset<String> ngrams = HashMultiset.create();
//added strings to the multiset...
ngrams.setCount(terms, Integer.MAX_VALUE);
for (Multiset.Entry<String> entry : ngrams.entrySet()) {
if (entry.getElement().equals(terms)) {
continue;
}
if (entry.getCount() > 3) {
ngrams.setCount(terms, 3);
}
}
if (ngrams.count(terms) == Integer.MAX_VALUE) {
ngrams.setCount(terms, 0);
}
如果您的情况更复杂,那么您最好创建一个新的 Multiset<String>
作为 Andy Turner