Как изменить мой оператор для печати частот типа элемента объекта в hashmap? - PullRequest
0 голосов
/ 11 декабря 2018

Я создал массивList объектов учеников с различными атрибутами.Среди этих атрибутов любимый цвет.Таким образом, в этом массиве из n студентов у каждого студента есть строковая переменная-член favourColor.

Set<student> studentUnique = new HashSet<student>(studentList);
for (user key : studentUnique) {
    System.out.println(key + ": " + Collections.frequency(studentList, key));
}

Я хотел бы посчитать частоту указанных цветов, например, для ста студентов, возможно, выведите:

red: 50
blue: 20
green: 30

Я поместил свой массив списков студентов (studentList) в хэш-карту, но я не знаю, как написать свое заявление о частоте, чтобы получить частоту учеников, которым нравятся их соответствующие цвета.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

По сути, то, что вы делаете, называется «группировкой» на основе любимого цвета.

Вот еще один подход:

 Map<String, Integer> result = 
         studentList.stream()
                    .collect(toMap(Student::getFavouriteColor, s -> 1, Math::addExact));

При этом используется коллектор toMap, гдеkeyMapper - это Student::getFavouriteColor, то есть функция, извлекающая любимый цвет студентов в качестве ключа карты.

Во-вторых, мы помещаем valueMapper функцию s -> 1, то есть функцию, принимающую Student и возвращающую 1 в качестве значения карты.

Наконец, мы предоставляем функцию «слияния» Math::addExact, которая используется для добавления двух соответствующих значений при наличии ключевого столкновения на основе избранного цвета.

Таким образом, в результате у нас будет карта из String ---> Integer, где каждая запись на карте представляет цвет и количество раз, когда этот цвет был выбран в качестве «любимого цвета» среди учащихся.'list.

Кроме того, если вы хотите распечатать этот результат в порядке возрастания на основе вхождений, вы можете отсортировать результат и распечатать его следующим образом:

studentList.stream()
           .collect(toMap(Student::getFavouriteColor, s -> 1, Math::addExact))
           .entrySet()
           .stream()
           .sorted(Map.Entry.comparingByValue())
           .forEachOrdered(e -> System.out.println(e.getKey() + ":" + e.getValue())); 

необходим импорт:

import java.util.stream.*;
import static java.util.stream.Collectors.*;
0 голосов
/ 11 декабря 2018
studentUnique.stream()
             .collect(Collectors.groupingBy(
                  Student::getColor, 
                  Collectors.counting()))

Предполагается, что getColor существует.

...