计算列表的平均值<;双倍>;在Java的HashMap中

计算列表的平均值<;双倍>;在Java的HashMap中,java,math,java-8,hashmap,java-stream,Java,Math,Java 8,Hashmap,Java Stream,给出一张从名字到数字列表的地图 我想使用Java8流api计算每个名称的平均值 Map<String, List<Double>> NameToQuaters = new HashMap<>(); Map<String, Double> NameToMean = ? Map NameToQuaters=newhashmap(); 映射名称到人=? 您需要这样的东西: Map<String, Double> nameToMean =

给出一张从名字到数字列表的地图

我想使用Java8流api计算每个名称的平均值

Map<String, List<Double>> NameToQuaters = new HashMap<>();

Map<String, Double> NameToMean = ?
Map NameToQuaters=newhashmap();
映射名称到人=?

您需要这样的东西:

Map<String, Double> nameToMean = nameToQuaters.entrySet()
        .stream()
        .collect(Collectors.toMap(
                // the key is the same
                Map.Entry::getKey,
                // for the value of the key, you can calculate the average like so
                e -> e.getValue().stream().mapToDouble(Double::doubleValue).average().getAsDouble())
        );
    }
Map nameToMean=nameToQuaters.entrySet()
.stream()
.collect(collector.toMap)(
//钥匙是一样的
Map.Entry::getKey,
//对于键的值,可以这样计算平均值
e->e.getValue().stream().mapToDouble(Double::doubleValue.average().getAsDouble())
);
}
或者,您可以创建一个进行平均并返回的方法,例如:

public Double average(List<Double> values) {
    return values.stream().mapToDouble(Double::doubleValue).average().getAsDouble();
}
公共双平均值(列表值){
返回值.stream().mapToDouble(Double::doubleValue).average().getAsDouble();
}
那么您的代码可以是:

Map<String, Double> nameToMean = nameToQuaters.entrySet()
        .stream()
        .collect(Collectors.toMap(Map.Entry::getKey, e -> average(e.getValue())) );
Map nameToMean=nameToQuaters.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,e->average(e.getValue()));

您需要这样的东西:

Map<String, Double> nameToMean = nameToQuaters.entrySet()
        .stream()
        .collect(Collectors.toMap(
                // the key is the same
                Map.Entry::getKey,
                // for the value of the key, you can calculate the average like so
                e -> e.getValue().stream().mapToDouble(Double::doubleValue).average().getAsDouble())
        );
    }
Map nameToMean=nameToQuaters.entrySet()
.stream()
.collect(collector.toMap)(
//钥匙是一样的
Map.Entry::getKey,
//对于键的值,可以这样计算平均值
e->e.getValue().stream().mapToDouble(Double::doubleValue.average().getAsDouble())
);
}
或者,您可以创建一个进行平均并返回的方法,例如:

public Double average(List<Double> values) {
    return values.stream().mapToDouble(Double::doubleValue).average().getAsDouble();
}
公共双平均值(列表值){
返回值.stream().mapToDouble(Double::doubleValue).average().getAsDouble();
}
那么您的代码可以是:

Map<String, Double> nameToMean = nameToQuaters.entrySet()
        .stream()
        .collect(Collectors.toMap(Map.Entry::getKey, e -> average(e.getValue())) );
Map nameToMean=nameToQuaters.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,e->average(e.getValue()));

这应该可以做到:

Map<String, List<Double>> nameToQuaters = new HashMap<>();
//fill source map
Map<String, Double> nameToMean = new HashMap<>();
nameToQuaters.
    .forEach((key, value) -> nameToMean.put(key, value.stream().mapToDouble(a -> a).average().getAsDouble()));
Map nameToQuaters=newhashmap();
//填充源地图
Map nameToMean=newhashmap();
姓名四分之一。
.forEach((key,value)->nameToMean.put(key,value.stream().mapToDouble(a->a.average().getAsDouble());

这应该可以做到:

Map<String, List<Double>> nameToQuaters = new HashMap<>();
//fill source map
Map<String, Double> nameToMean = new HashMap<>();
nameToQuaters.
    .forEach((key, value) -> nameToMean.put(key, value.stream().mapToDouble(a -> a).average().getAsDouble()));
Map nameToQuaters=newhashmap();
//填充源地图
Map nameToMean=newhashmap();
姓名四分之一。
.forEach((key,value)->nameToMean.put(key,value.stream().mapToDouble(a->a.average().getAsDouble());

准重复:准重复:问题不在于总和,而在于平均数。从DoubleStream中收集平均值很容易,但是如果你要提供答案,你最好走最后一步:-)@GPI抱歉,在我使用google之前,我不理解正确的问题我现在明白了,OP需要平均值,对吗?现在也检查我的答案!问题不在于总数,而在于平均数。从DoubleStream中收集平均值很容易,但是如果你要提供答案,你最好走最后一步:-)@GPI抱歉,在我使用google之前,我不理解正确的问题我现在明白了,OP需要平均值,对吗?现在也检查我的答案!除了不使用流之外,这是一个简洁的解决方案。通过使用
Map.forEach()
而不是
Map.entrySet().forEach()
,您可以使阅读变得更轻松。这使得
条目。get…
不必要。Thx到@lore。“value.stream().mapToDouble(a->a).average().getAsDouble()”将在另一个地方派上用场除了不使用stream之外,这是一个简洁的解决方案。通过使用
Map.forEach()
而不是
Map.entrySet().forEach()
,您可以使阅读变得更轻松。这使得
条目。get…
不必要。Thx到@lore。“value.stream().mapToDouble(a->a).average().getAsDouble()”将在另一个地方派上用场