Javaストリーム一覧<地図<文字列、ダブル>>文字列に基づいて平均必要

Hruday:

私は、リストの平均を必要とします

    List<Measurement> measurements = new ArrayList<>();

    Measurement m1 = new Measurement();
    Map<String,Double> map1 = new HashMap<>();
    map1.put("age",18.0);
    map1.put("score",88.0);
    map1.put("rating",5.0);
    m1.setMetric(map1);

    Measurement m2 = new Measurement();
    Map<String,Double> map2 = new HashMap<>();
    map2.put("age",21.0);
    map2.put("score",null);
    map2.put("rating",23.0);
    m2.setMetric(map2);

    Measurement m3 = new Measurement();
    Map<String,Double> map3 = new HashMap<>();
    map3.put("age",31.0);
    map3.put("score",32.0);
    map3.put("rating",null );
    m3.setMetric(map3);

    measurements.add(m1);
    measurements.add(m2);
    measurements.add(m3);

どのように私は地図の上のリストの平均年齢を入手できます。また、ヌル値を無視して平均スコア。

すべてのヘルプは本当にいただければ幸いです。私は3日以来の修正に苦労しています。前もって感謝します。

ブック:

このようのためのMeasurementクラス:

class Measurement {

    Map<String, Double> map;

    public void setMetric(Map<String, Double> map) {
        this.map = map;
    }
}

(ストリームを使用して)avarage「年齢」を見つける方法:

Double averageAge = measurements.stream()
        .collect(Collectors.averagingDouble(node -> node.map.getOrDefault("age", 0D)));

そして、ヌル値を許可する「スコア」のためのストリーム:

ヌルチェックとavarage「年齢」(使用してストリーム)を見つける方法:

Double averageAge = measurements.stream()
        .filter(node -> node.map.get("score") != null)
        .collect(Collectors.averagingDouble(node -> node.map.getOrDefault("score", 0D)));

上記のコードでは、持っているnode.mapところmapフィールドフォームクラスです。置き換えることができますgetMap()か(あなたがで設定されているさまざまな方法で返す値setMetric()

(ループを使用して)avarage「年齢」を見つける方法:

Double average = 0D;
for (Measurement measure : measurements) {
    average += measure.map.getOrDefault("age", 0D);
}
average /= measurements.size();

ヌルチェックとavarage「スコア」(使用してループ)を見つける方法:

Double average = 0D;
int counter = 0;
for (Measurement measure : measurements) {
    if (measure.map.get("score") != null) {
        average += measure.map.getOrDefault("score", 0D);
        counter++;
    }
}
average /= counter;

ヌルチェックして(ループを使用して)最小の「スコア」を見つける方法:

Double min = Double.MAX_VALUE;

for (Measurement measure : measurements) {
    Double score = measure.map.get("score");
    if (score != null && score < min) {
        min = score;
    }
}

System.out.println(min);

最大の「年齢」を見つける方法(ストリームを使用)

Double max = measurements.stream()
        .filter(node -> node.map.get("score") != null)
        .mapToDouble(node -> node.map.get("score"))
        .max()
        .orElse(0.0);

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=214532&siteId=1