如何更改我的语句以在哈希图中打印对象成员类型的频率?

时间:2018-12-11 14:07:28

标签: java arraylist collections hashmap

我创建了具有各种属性的学生对象的arrayList。这些属性包括最喜欢的颜色。因此,在这个由n个学生组成的数组列表中,每个学生都有一个字符串favoriteColor成员变量。

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

我将学生的arrayList(studentList)放入哈希图中,但是我不知道如何编写频率声明来获取喜欢各自颜色的学生的频率。

2 个答案:

答案 0 :(得分:5)

studentUnique.stream()
             .collect(Collectors.groupingBy(
                  Student::getColor, 
                  Collectors.counting()))

假设getColor存在。

答案 1 :(得分:1)

基本上,您正在做的事情被称为基于喜欢的颜色的“分组”。

这是另一种方法:

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

这使用toMap收集器,其中keyMapperStudent::getFavouriteColor,即提取学生喜欢的颜色作为映射键的函数。

第二,我们放置valueMapper函数s -> 1,即,一个带有Student并返回1作为映射值的函数。

最后,我们提供了一个“合并”函数Math::addExact,该函数用于根据喜欢的颜色在给定键冲突的情况下添加两个对应的值。

因此,因此,我们将获得String ---> Integer中的映射,其中映射中的每个条目代表颜色以及该颜色被选择为颜色的次数。学生名单中的“最喜欢的颜色”。

此外,如果您希望根据出现的情况以升序打印此结果,则可以对结果进行排序并按以下方式打印:

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.*;