第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

java - 如何使用Java流獲得具有相同最大值的所有對(duì)象?

java - 如何使用Java流獲得具有相同最大值的所有對(duì)象?

慕勒3428872 2022-05-21 13:51:38
我有得分的球員。我想獲得所有使用流和過(guò)濾器共享最大積分的玩家。public class Player {    private int points; // Getter omitted}我可以通過(guò)首先獲得得分最高的玩家,然后過(guò)濾所有得分相同的玩家來(lái)做到這一點(diǎn)。Player topPlayer = players.stream().max(Comparator.comparing(Player::getPoints)).orElse(null);players.stream().filter(p -> p.getPoints() == topPlayer.getPoints()).collect(Collectors.toList());這可以用單個(gè)謂詞/單行來(lái)完成嗎?
查看完整描述

3 回答

?
LEATH

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();


查看完整回答
反對(duì) 回復(fù) 2022-05-21
?
蕭十郎

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);


查看完整回答
反對(duì) 回復(fù) 2022-05-21
?
汪汪一只貓

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);

}


查看完整回答
反對(duì) 回復(fù) 2022-05-21
  • 3 回答
  • 0 關(guān)注
  • 155 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)