Loops 在Java中遍历多映射

Loops 在Java中遍历多映射,loops,for-loop,guava,multimap,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+=(In

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

这就是我现在写的

        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);
    }
它指向for(String key:result.keys())行
,但错误不在本次迭代中,因为如果我删除for循环中的内容,它就会工作。因此,我的问题是通过每个键的值进行迭代

谢谢你的帮助


提前谢谢

如注释中所述,集合在迭代时被修改时会抛出ConcurrentModificationException。无论如何,对源集合进行变异是一种不好的做法,因此最好创建一个新集合并返回它

我会写:

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();
}
ImmutableMultimap计算访问(Multimap Multimap){
ImmutableMultimap.Builder结果=ImmutableMultimap.Builder();
for(字符串键:multimap.keySet()){
集合值=multimap.get(键);
结果。put(关键值、平均值);
}
返回result.build();
}
整数平均值(集合值){
整数和=0;
for(整数值:值){
总和+=数值;
}
返回sum/values.size();
}
旁白:

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

阅读以下内容:,以及:为什么不将结果存储在映射中,而不是修改现有的多重映射并存储单个值?为什么要将类型安全集合转换为对象数组,需要转换为整数?您可以直接迭代整数集合。此外,每个键的访问应该从0开始,而不仅仅是第一个键。更好的是,将结果存储在
Multiset
中,非常感谢!你的帮助真的很有用。
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();
}