IT序号网

loops之在 Java 中遍历多 map

zfyouxi 2024年06月03日 编程语言 10 0

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

这是我现在写的

        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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!