java - 获取得分为 "x"分的学生列表 Java8 List<Student> 到 Map<Marks,List<Name>>,限制名称数量

标签 java lambda java-8 java-stream

我想将对象列表转换为Map<K,List<V>> ,但列表中的总体项目是有限的。限制 = 1024 此问题分为两个阶段:

Student {
    name: String
    marks: Long
}

同名可能有多个标记。在这种情况下需要添加标记。 第一阶段的预期结果 - 学生姓名和总分

originalStudentList = List<Student>
intermediateMap = Map <String, Long>
newExpectedMap Map<Long, List<String>

第一阶段:

originalStudentList.stream()
.collect(Collectors.toConcurrentMap(Student::getName,
                Student::getMarks, (marks1, marks2) -> marks1+marks2));

其输出将是 -

originalStudentList = [{"a",3},{"b",2},{"c",3},{"d",2},{"a",2},{"f",7},{"e",3}];

intermediateMap = [{"a",5},{"b",2},{"c",3},{"d",2},{"f",7},{"e",3}];

第二阶段: 现在,假设我只想要前 5 名学生的 map

intermediateMap.entrySet()
            .stream
            .collect(Collectors.groupingBy(Map.Entry::getValue,
                Collectors.mapping(Map.Entry::getKey, Collectors.toList())));

使用上面的代码我会得到下面的 map

newExpectedMap = [{7,{"f"}},{5,{"a"}},{3,{"c","e"}},{2,{"b","d"}}]

但是我想将字符串中的项目数量限制为 5 - 所以我想要

newExpectedMap = [{7,{"f"}},{5,{"a"}},{3,{"c","e"}},{2,{"b"}}]

注意:我可以删除 b 或 d,但它必须来自最后的条目。如果限制是 3 那么它将从 key:3 中删除

我陷入了第 2 阶段 - 但我可以修改整个流程,如果这能让事情变得简单的话。

最佳答案

如果我正确理解你的问题,你无法一步实现这一目标,而是使用两个步骤:

Map<Long, List<String>> top5 = students.stream()
        .collect(Collectors.groupingBy(Student::getName, Collectors.summingLong(Student::getMarks)))
        .entrySet().stream()
        .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
        .limit(5)
        .collect(Collectors.groupingBy(Map.Entry::getValue, LinkedHashMap::new,
                Collectors.mapping(Map.Entry::getKey, Collectors.toList())));

第一部分与第一阶段相同,您按值对结果进行排序并将结果列表限制为5,您可以再次收集结果。如果您希望 map 中的项目按顺序排列,请使用 LinkedHashMap 就像我上面所做的那样。

结果将是这样的:

{7=[f], 5=[a], 3=[c, e], 2=[b]}

关于java - 获取得分为 "x"分的学生列表 Java8 List<Student> 到 Map<Marks,List<Name>>,限制名称数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57614526/

相关文章:

java - 编译测试库不编译接口(interface)的静态方法(Java 8)

Java 8 : Convert a map with string values to a list containg a different type

Java lambda 参数类型未正确推断

Java 8 和流上的聚合操作

java - 收集 IntStream 映射时出错

java - 用于远程 JVM 的 JVisualVM CPU 分析

java - 与 Btree 算法作斗争

java - 尝试在数据库中存储 Json 时出现 Ebean 'No service implementation found for SpiJsonService'

java - 如何找出 Java VM 实际加载的信任库文件?

c# - 一般 Lambda 语法问题