es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener el valor máximo de un conjunto con atributos en Java utilizando un mapeador.

Tengo un problema. Estoy tratando de crear una función que devuelva el valor máximo de un atributo dado en un Set<Measurement>. Esta es la función que tengo actualmente:

public Map<Integer,Double> annualMaximumTrend(Function<Measurement,Double> mapper) {
    Map<Integer, Double> maximumValue = new LinkedHashMap<>();

    int startYear = determineStartYear();
    for (int year = startYear; year <= LocalDate.now().getYear(); year++) {
        LocalDate startDate = LocalDate.of(year - 1, 12, 31);
        LocalDate endDate = LocalDate.of(year + 1, 1, 1);
        Set<Measurement> stationAverages = new HashSet<>();
        for (Station station : stations.values()) {
            stationAverages.addAll(station
                    .getMeasurements()
                    .stream()
                    .filter(m -> m.getDate().isAfter(startDate) &&
                            m.getDate().isBefore(endDate) &&
                            !Double.isNaN(mapper.apply(m))
                    ).collect(Collectors.toSet()));
        }

        OptionalDouble maximum = stationAverages.stream().mapToDouble(mapper).max();
        
        if (maximum.isPresent())
            maximumValue.put(year, maximum.getAsDouble());

    }

    return maximumValue;
}

Pero necesito determinar el máximo de manera diferente, porque en vez de Measurement::getMaxTemperature, necesito usar el mapper.apply() en algún lugar, porque ese mapper decide de cuál atributo quiero el valor máximo. ¿Cómo necesito usar el mapper?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para utilizar la función mapper y determinar el valor máximo de un atributo específico en Measurement, es necesario reemplazar Measurement::getMaxTemperature con mapper. Esto significa que en lugar de llamar al método getMaxTemperature en cada objeto Measurement en el flujo de datos, se llamará a la función mapper, que devolverá el valor del atributo del que se desea determinar el valor máximo.

    Aquí está el código actualizado para la función annualMaximumTrend:

    public Map<integer, double=""> annualMaximumTrend(Function<measurement, double=""> mapper) {
        Map<integer, double=""> maximumValue = new LinkedHashMap<>();
    
        int startYear = determineStartYear();
        for (int year = startYear; year <= LocalDate.now().getYear(); year++) {
            LocalDate startDate = LocalDate.of(year - 1, 12, 31);
            LocalDate endDate = LocalDate.of(year + 1, 1, 1);
            Set<measurement> stationAverages = new HashSet<>();
            for (Station station : stations.values()) {
                stationAverages.addAll(station
                        .getMeasurements()
                        .stream()
                        .filter(m -> m.getDate().isAfter(startDate) &&
                                m.getDate().isBefore(endDate) &&
                                !Double.isNaN(mapper.apply(m))
                        ).collect(Collectors.toSet()));
            }
    
            OptionalDouble maximum = stationAverages.stream().mapToDouble(mapper).max();
    
            if (maximum.isPresent())
                maximumValue.put(year, maximum.getAsDouble());
    
        }
    
        return maximumValue;
    }
    

    En este código actualizado, se puede observar que el método Measurement::getMaxTemperature ha sido reemplazado con mapper en el método mapToDouble. Esto significa que la función mapper ahora se llamará en cada objeto Measurement en el flujo de datos para determinar el valor del atributo del que se desea encontrar el valor máximo.</integer,></measurement,></integer,>

Comments are closed.