在 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 ,而不是同时修改和迭代。 (或者其他一些不涉及并发迭代和修改等的解决方案)