我有一个多重映射,其中我的键是一个字符串,值是整数。我想遍历所有这些整数,以计算它们的平均值,最后,只需存储键和平均值。
这是我现在写的
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 循环中的内容,它将起作用。所以我的问题在于迭代每个键的值。
非常感谢您的帮助。
提前致谢!
请您参考如下方法:
正如评论中所解释的,集合在被迭代时被修改时会抛出 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()
也会使您失去通用性,迫使您将每个值都转换为 Integer。 - 您应该使用
.keySet()
方法而不是keys()
方法,它返回一个Multiset
。迭代此Multiset
时,与多个值关联的键将出现多次。 - 在计算新平均值之前,您的“访问次数”变量未重置为 0