Ponga una suma como valor en un HashMap

Natalie_eds:

Mis dos listas list2y filetempson de la misma longitud y contienen fechas y temperaturas. Algunos de los elementos de las listas se muestran a continuación:

[1946-01-12, 1946-01-12, 1946-01-12, 1946-01-13, 1946-01-13, 1946-01-13, 1946-01-14, 1946-01-14, 1946-01-14]
[-1.3, 0.3, -2.8, -6.2, -4.7, -4.3, -1.5, -0.2, -0.4]

Quiero ponerlos en un HashMap con fechas como clave y la temperatura como el valor. Ya que tengo varios valores de temperatura correspondientes a cada fecha, quiero sumar los valores de temperatura para cada día (o si la temperatura media es posible calcular para cada día) de manera que cada fecha en el mapa corresponde a la temperatura media de esa fecha. Mi problema ahora es que mi mapa se ve así:

1946-01-12: -2.8
1946-01-13: -4.3
1946-01-14: -0.4

así que en vez de sumar por ejemplo -1,5 + (- 0,2) + (- 0,4) para la fecha 01/14/1946 simplemente devuelve la última temperatura de esa fecha. ¿Alguien sabe cómo arreglarlo?

public Map<LocalDate, Double> avarageTemperatures(LocalDate dateFrom, LocalDate dateTo) {
    List<LocalDate> list2 = new ArrayList<>();
    for (Weather weather : weatherData) {
        list2.add(weather.getDateTime());
    }

    Map<LocalDate, Double> map = new HashMap<>();
    List<Double> filetemp = new ArrayList<>();
    for (Weather weather : weatherData) {
        filetemp.add(weather.getTemperature());
    }
    Double val= 0.0;
    for (int i=1; i<list2.size(); i++) {
        if(list2.get(i)==list2.get(i-1)) {
            val+= filetemp.get(i);
            map.put(list2.get(i), val);
        } else {
            val=filetemp.get(i);
            map.put(list2.get(i), val);
        }
    }

    Set<Map.Entry<LocalDate, Double>> entrySet = map.entrySet();
    for(Map.Entry<LocalDate,Double> entry : entrySet) {
        if(!entry.getKey().isAfter(dateTo) && !entry.getKey().isBefore(dateFrom)) {
            System.out.println(entry.getKey()+": "+(entry.getValue()));
        }
    }

    return map;
}
Jason:

Esta es una forma que puede hacerlo. Para obtener una lista de los objetos del tiempo como si tuviera que crear una lista de objetos del tiempo utilizando la matriz de cadena y la matriz de valores Double. De esa lista que simplemente recoger mediante colectores # groupingBy que nos permite determinar la tecla que desea agrupar por, que en este caso es LocalDate, y el colector utilizan para agrupar todos los valores clave relevantes juntos, que en este caso es para coleccionistas # summingDouble ya que queremos sumar todos los valores dobles.

        String[] dates = {
                "1946-01-12", "1946-01-12", "1946-01-12", "1946-01-13", "1946-01-13", "1946-01-13",
                "1946-01-14", "1946-01-14", "1946-01-14"
        };

        double[] temperatures = {-1.3, 0.3, -2.8, -6.2, -4.7, -4.3, -1.5, -0.2, -0.4};

        class Weather {

            private final LocalDate date;

            private final double temperature;

            Weather(LocalDate date, double temperature) {
                this.date = date;
                this.temperature = temperature;
            }

            public LocalDate getDate() {
                return date;
            }

            public double getTemperature() {
                return temperature;
            }
        }

        List<Weather> weather = IntStream.range(0, dates.length)
                .mapToObj(index -> new Weather(LocalDate.parse(dates[index]), temperatures[index]))
                .collect(Collectors.toList());        

       Map<LocalDate, Double> temperaturesSum = weather.stream()
                .collect(Collectors.groupingBy(Weather::getDate,
                        Collectors.summingDouble(Weather::getTemperature)));

        Map<LocalDate, Double> temperaturesAverage = weather.stream()
                .collect(Collectors.groupingBy(Weather::getDate,
                        Collectors.averagingDouble(Weather::getTemperature)));

        System.out.println("sum: " + temperaturesSum);
        System.out.println("average: " + temperaturesAverage);

Salida

sum: {1946-01-12=-3.8, 1946-01-13=-15.2, 1946-01-14=-2.1}
average: {1946-01-12=-1.2666666666666666, 1946-01-13=-5.066666666666666, 1946-01-14=-0.7000000000000001}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=279617&siteId=1
Recomendado
Clasificación