在Java中迭代多个映射

时间:2014-06-05 17:07:14

标签: loops for-loop guava multimap

我有一个多图,其中我的键是一个字符串,值是整数。我想迭代所有那些整数,以便计算它们的平均值,最后,只需存储密钥和平均值。

这就是我现在所写的

        int visits = 0;
    for (String key : result.keys()) {
        Object[] val = result.get(key).toArray();
        for (int i=0; i<val.length; i++){
            visits+=(Integer)val[i];
        }
        visits=visits/val.length;
        result.removeAll(key);
        result.put(key, visits);
    }

但是我收到了这个错误

at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at com.google.common.collect.AbstractMapBasedMultimap$Itr.next(AbstractMapBasedMultimap.java:1150)
at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
at subset.calcMax.meanCalc(calcMax.java:147)
at subset.calcMax.main(calcMax.java:208)

它指向行for (String key : result.keys()),但错误不在此迭代中,因为如果我删除for循环中的内容就可以了。所以我的问题在于迭代每个键的值。

感谢您的帮助。

提前致谢!

1 个答案:

答案 0 :(得分:1)

如注释中所述,集合在迭代时修改时抛出ConcurrentModificationExceptions。无论如何都要改变源集合是不好的做法,所以你最好创建一个新的集合并返回它。

我会写:

ImmutableMultimap<String, Integer> computeMeanVisits(Multimap<String, Integer> multimap) {
    ImmutableMultimap.Builder<String, Integer> result = ImmutableMultimap.builder();

    for (String key : multimap.keySet()) {
        Collection<Integer> values = multimap.get(key);
        result.put(key, mean(values));
    }
    return result.build();
}

int mean(Collection<Integer> values) {
    int sum = 0;
    for (Integer value : values) {
        sum += value;
    }
    return sum / values.size();
}

暂且不说:

  • 我不喜欢您使用.toArray()来迭代值。在Java中,通常首选直接操作集合。应该为非常特定的高性能代码保留直接阵列操作,或者当您必须处理仅接受数组的错误API时。请注意,在您的示例中,使用.toArray()也会使您失去通用性,迫使您将每个值强制转换为整数。
  • 您应该使用.keySet()方法而不是keys()方法,该方法返回Multiset。迭代此Multiset时,与多个值关联的键将多次出现。
  • 您的“访问”变量在计算新均值之前未重置为0