Максимальное значение потока Java от среднего - PullRequest
0 голосов
/ 10 января 2019

Я должен получить название страны Максимальная средняя температура.

Я использовал следующие, чтобы получить средние температуры

 this.getTemperatures()
                .stream()
                .collect(Collectors.groupingBy(Temperature::getCountry,
                        Collectors.averagingDouble(Temperature::getAverageTemperature)))

Как я могу получить максимальное или минимальное среднее название страны из этого списка средних температур?

Ответы [ 4 ]

0 голосов
/ 11 января 2019

Вы можете попробовать DoubleSummaryStatistics:

this.getTemperatures()
            .stream()
            .collect(Collectors.groupingBy(Temperature::getCountry,
                    Collectors.summarizingDouble(Temperature::getAverageTemperature)));

это вернет карту:

Map<Country, DoubleSummaryStatistics>

Таким образом, с помощью DoubleSummaryStatistics вы можете получить количество, сумму, минимум, максимум, среднее для каждой страны

0 голосов
/ 10 января 2019

Мне это не очень нравится, потому что большая часть кода повторяется, но это будет работать. Я не могу найти способ избежать повторения без ухудшения кода.

Это также повторяет все записи на карте дважды, но, учитывая, что существует только 195 стран, мы говорим о максимально 195 дополнительных итерациях (если у вас есть измерения для каждой), и это совершенно незначительная величина для ЦПУ.

String max = countryToAvgTemp.entrySet().stream()      //stream all entries
    .max(Map.Entry.comparingByValue())                 //get the max by comparing entry value
    .map(Map.Entry::getKey)                            //grab the key   
    .orElseThrow(() -> new RuntimeException("No max")); //e.g. if the list is empty

String min = countryToAvgTemp.entrySet().stream()
    .min(Map.Entry.comparingByValue())
    .map(Map.Entry::getKey)
    .orElseThrow(() -> new RuntimeException("No min"));

Если вы хотите выполнить итерацию только один раз, вы можете написать свой собственный сборщик, который возвращает что-то вроде MinMax<String>. Я написал один, но код не был отличным. Лучше быть проще.

0 голосов
/ 10 января 2019

Если вы хотите получить максимальное или минимальное среднее название страны , вы можете отсортировать список температур, а затем получить первый и последний элемент。 Но ваша работа не нуждается в отсортированном списке , это плохой метод , @ Метод Майкла очень хорошо для тебя.

       List<Temperature> temperatures = Arrays.asList(
                new Temperature("a",10),
                new Temperature("b",11),
                new Temperature("c",12),
                new Temperature("d",13),
                new Temperature("e",14),
                new Temperature("f",15),
                new Temperature("g",16),
                new Temperature("h",17));

        temperatures = temperatures.stream().sorted(new Comparator<Temperature>() {
            @Override
            public int compare(Temperature o1, Temperature o2) {
                return (int) (o1.getAverageTemperature() - o2.getAverageTemperature());
            }
        }).collect(Collectors.toList());

        String min = temperatures.get(0).getCountry();
        String max = temperatures.get(temperatures.size()-1).getCountry();
0 голосов
/ 10 января 2019

Использование

Collections.min(temperatureMap.entrySet(), Comparator.comparingInt(Map.Entry::getValue)).getValue()

и

Collections.max(temperatureMap.entrySet(),  Comparator.comparingInt(Map.Entry::getValue)).getValue()
...