我希望将对象列表转换为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}];第二阶段:现在,让我说我只想要前五名学生的地图。
intermediateMap.entrySet()
.stream
.collect(Collectors.groupingBy(Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey, Collectors.toList())));有了上面的代码,我就可以得到下面的地图
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,则从键中移除:3。
我被困在第二阶段,但我可以修改整个流程,如果这是什么东西,使它很容易。
发布于 2019-08-22 19:30:49
如果我正确理解你的问题,你不能一步一步地做到这一点,而是使用两个:
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,就像我前面所做的那样。
其结果将是:
{7=[f], 5=[a], 3=[c, e], 2=[b]}https://stackoverflow.com/questions/57614526
复制相似问题