首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取得分为"x“的学生名单( Java8 List<Student> to Map<Marks,List<Name>> ),并限定名称数。

获取得分为"x“的学生名单( Java8 List<Student> to Map<Marks,List<Name>> ),并限定名称数。
EN

Stack Overflow用户
提问于 2019-08-22 17:38:31
回答 1查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
Student {
    name: String
    marks: Long
}

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

代码语言:javascript
复制
originalStudentList = List<Student>
intermediateMap = Map <String, Long>
newExpectedMap Map<Long, List<String>

第一阶段:

代码语言:javascript
复制
originalStudentList.stream()
.collect(Collectors.toConcurrentMap(Student::getName,
                Student::getMarks, (marks1, marks2) -> marks1+marks2));

它的输出将是-

代码语言:javascript
复制
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}];

第二阶段:现在,让我说我只想要前五名学生的地图。

代码语言:javascript
复制
intermediateMap.entrySet()
            .stream
            .collect(Collectors.groupingBy(Map.Entry::getValue,
                Collectors.mapping(Map.Entry::getKey, Collectors.toList())));

有了上面的代码,我就可以得到下面的地图

代码语言:javascript
复制
newExpectedMap = [{7,{"f"}},{5,{"a"}},{3,{"c","e"}},{2,{"b","d"}}]

但是,我希望将字符串中的项目数限制为5,所以我希望

代码语言:javascript
复制
newExpectedMap = [{7,{"f"}},{5,{"a"}},{3,{"c","e"}},{2,{"b"}}]

注意:我同意删除b或d,但必须是从最后一个条目中删除。如果限制为3,则从键中移除:3。

我被困在第二阶段,但我可以修改整个流程,如果这是什么东西,使它很容易。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-22 19:30:49

如果我正确理解你的问题,你不能一步一步地做到这一点,而是使用两个:

代码语言:javascript
复制
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,您可以再次收集结果。如果您希望将项目降到地图中,请使用LinkedHashMap,就像我前面所做的那样。

其结果将是:

代码语言:javascript
复制
{7=[f], 5=[a], 3=[c, e], 2=[b]}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57614526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档