繁体   English   中英

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

[英]How to change my statement to print frequencies of object member type in 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)放入哈希图中,但是我不知道如何编写频率声明来获取喜欢各自颜色的学生的频率。

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

假设存在getColor

本质上,您正在执行的操作被称为基于喜欢的颜色的“分组”。

这是另一种方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM