gpt4 book ai didi

loops - 在 Java 中遍历多 map

转载 作者:行者123 更新时间:2023-12-02 03:35:00 25 4
gpt4 key购买 nike

我有一个多重映射,其中我的键是一个字符串,值是整数。我想遍历所有这些整数,以计算它们的平均值,最后,只需存储键和平均值。

这是我现在写的

        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

关于loops - 在 Java 中遍历多 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24066131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com