Shr*_*dha 3 java sorting comparator
我有一个具有名称和分数的对象。我想按名称对元素进行排序,并找到该名称的最高分。
例如,下面是对象(name,score):
(a, 3)
(a, 9)
(b, 7)
(b, 10)
(c, 8)
(c, 3)
Run Code Online (Sandbox Code Playgroud)
输出应为:
(a, 9)
(b, 10)
(c, 8)
Run Code Online (Sandbox Code Playgroud)
我可以使用以下代码进行排序,但无法找到最大
List<Record> result = list.stream()
.sorted(Comparator.comparing(Record::score))
.collect(Collectors.groupingBy(Record::name, LinkedHashMap::new, Collectors.toList()))
.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
@Eran的回答非常好。尽管如此,我还是会反其道而行之,先分组,然后减少:
List<Record> result = list.stream()
.collect(Collectors.groupingBy(Record::getName,
Collectors.maxBy(Comparator.comparing(Record::getScore))))
.values().stream()
.map(Optional::get)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
这里的一个缺点是你必须调用Optional#get。但由于 groupingBy 产生的组永远不会为空,因此您可以调用Optional#get而不会出现异常。
您需要链接maxBy
到groupinhBy
收藏家:
Map<String,Record> result =
list.stream()
.sorted(Comparator.comparing(Record::score))
.collect(Collectors.groupingBy(Record::name,
LinkedHashMap::new,
Collectors.maxBy(Comparator.comparing(Record::getScore))));
Run Code Online (Sandbox Code Playgroud)
如果你只关心Record
的情况下,你可以得到values()
的那个Map
。