Java 查找字符串连接情况的最大发生率
我有一个对象列表学生列表: 对象: 我正在尝试查找出现次数最多的学生的姓名,并按照我使用的方法进行操作:Java 查找字符串连接情况的最大发生率,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个对象列表学生列表: 对象: 我正在尝试查找出现次数最多的学生的姓名,并按照我使用的方法进行操作: listOfStudents.stream().map(Student::getName)collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 如果没有领带,我就用 Collections.max(collect.entrySet(), Map.Entry.comparingByValue()
listOfStudents.stream().map(Student::getName)collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
如果没有领带,我就用
Collections.max(collect.entrySet(), Map.Entry.comparingByValue()).getKey();
确定出现次数最多的名称
但是,学生的名字也可能是并列的,在这种情况下,我想选择来学校次数最多的学生的名字,也就是说,在所有名字中,来学校次数最多的学生的名字
例如:
Student 1: Name: Hello numberOfTimesComeToSchool: 1
Student 2: Name: Hello numberOfTimesComeToSchool: 4
Student 3: Name: Trial numberOfTimesComeToSchool: 2
Student 4: Name: Trial numberOfTimesComeToSchool: 2
Student 5: Name: NeedThis numberOfTimesComeToSchool: 2
Student 6: Name: NeedThis numberOfTimesComeToSchool: 2
在这种情况下,正确的答案应该是Hello,因为numberOfTimesComeToSchool的和是5,而对于其余的名称,它只有4,即使所有名称出现的次数相同
如果有任何帮助,我们将不胜感激 使用
.map(Student::getName)
的问题在于,您丢失了有关每个学生上学次数的信息
相反,只需在原始列表上使用groupingBy
,即可获得映射。然后迭代映射的条目集,首先比较列表的大小,然后比较numberOfTimesComeToSchool
的总和(如果是平局),找到最大条目
Map<String, List<Student>> map =
listOfStudents.stream().collect(Collectors.groupingBy(Student::getName));
Optional<String> studentName =
map.entrySet()
.stream()
.max(Comparator.<Map.Entry<String, List<Student>>>comparingInt(e -> e.getValue().size())
.thenComparingInt(e -> e.getValue().stream().mapToInt(Student::getNumberOfTimesComeToSchool).sum()))
.map(Map.Entry::getKey);
我怎样才能使用它呢?我以前从来都不知道学生的名字。调用HashBag.uniqueSet()
并对其进行迭代。文件:
Map<String, List<Student>> map =
listOfStudents.stream().collect(Collectors.groupingBy(Student::getName));
Optional<String> studentName =
map.entrySet()
.stream()
.max(Comparator.<Map.Entry<String, List<Student>>>comparingInt(e -> e.getValue().size())
.thenComparingInt(e -> e.getValue().stream().mapToInt(Student::getNumberOfTimesComeToSchool).sum()))
.map(Map.Entry::getKey);
Optional<String> studentName =
listOfStudents.stream()
.collect(collectingAndThen(groupingBy(Student::getName),
m -> m.entrySet()
.stream()
.max(Comparator.<Map.Entry<String, List<Student>>>comparingInt(e -> e.getValue().size())
.thenComparingInt(e -> e.getValue().stream().mapToInt(Student::getNumberOfTimesComeToSchool).sum()))
.map(Map.Entry::getKey)));