我有一个多图,其中我的键是一个字符串,值是整数。我想迭代所有那些整数,以便计算它们的平均值,最后,只需存储密钥和平均值。
这就是我现在所写的
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循环中的内容就可以了。所以我的问题在于迭代每个键的值。
感谢您的帮助。
提前致谢!
答案 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
时,与多个值关联的键将多次出现。