3 回答

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以收集到TreeMap第一個(gè)并且只獲取最后一個(gè)條目(最大值所在的位置)
players.stream()
.collect(Collectors.groupingBy(
Player::getPoints,
TreeMap::new,
Collectors.toList()
))
.lastEntry()
.getValue();

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
首先按點(diǎn)分組,得到一個(gè) Map 結(jié)果,然后找到 map 中的 max key。時(shí)間成本將為 O(n):
List<Player> players = new ArrayList<>();
players.stream().collect(Collectors.groupingBy(Player::getPoints))
.entrySet().stream()
.max(Map.Entry.comparingByKey())
.ifPresent(System.out::println);

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
這是一個(gè)使用自定義收集器的版本。它巨大、丑陋和復(fù)雜,但它在O(n)中運(yùn)行,只對(duì)數(shù)據(jù)進(jìn)行一次傳遞,并且?guī)缀醪恍枰~外的空間。
List<Player> highest = players.stream().collect(ArrayList::new,
(list, player) -> {
if (list.isEmpty() || list.get(0).getPoints() == player.getPoints()) {
list.add(player);
} else if (list.get(0).getPoints() < player.getPoints()) {
list.clear();
list.add(player);
}
},
(l1, l2) -> {
if (l1.isEmpty()) {
l1.addAll(l2);
} else if (!l2.isEmpty()) {
int cmp = Integer.compare(l1.get(0).getPoints(), l2.get(0).getPoints());
if (cmp < 0) {
l1.clear();
l1.addAll(l2);
} else if (cmp == 0) {
l1.addAll(l2);
}
}
});
累加器和組合器具有關(guān)聯(lián)性的證明留給讀者作為練習(xí)。
編輯:我試圖寫(xiě)一個(gè)更漂亮的組合器。我設(shè)法寫(xiě)了一個(gè)更短更奇怪的。我相信它與上面的相同:
(l1, l2) -> {
int cmp = l1.stream().findAny().flatMap(p1 -> l2.stream().findAny().map(
p2 -> Integer.compare(p1.getPoints(), p2.getPoints()))).orElse(0);
if (cmp < 0) l1.clear();
if (cmp <= 0) l1.addAll(l2);
}
添加回答
舉報(bào)