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

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

在這種情況下如何對(duì)列表進(jìn)行流式排序?

在這種情況下如何對(duì)列表進(jìn)行流式排序?

交互式愛(ài)情 2022-11-10 15:03:19
我在 Java 中有一個(gè)帶有兩個(gè)時(shí)間戳的對(duì)象列表,例如:Obj(TimeStamp ts,TimeStamp generationTs,int 值)。最后,我不希望列表中的兩個(gè)項(xiàng)目具有相同的 ts。如果有的話,我只想保留最新一代 T 的那個(gè)。實(shí)際上,我有那個(gè)代碼,它可以工作,但我想知道如果使用流,我不能做更好的事情嗎?list.sort(Collections.reverseOrder());List<Obj> returnedList = Lists.newArrayList();if (!list.isEmpty()) {   returnedList.add(list.get(0));   Iterator<Obj> i = list.iterator();   while (i.hasNext()) {       Obj lastObj = returnedList.get(returnedList.size() - 1);       Obj nextObj = i.next();       if (!lastObj.getTs().isEqual(nextObj.getTs())) {           returnedList.add(nextObj);       } else {           if (lastObj.getGenerationTs().isBefore(nextObj.getGenerationTs())) {             returnedList.remove(lastObj);             returnedList.add(nextObj);           }        }    }}如果列表是:{("2019-05-02T09:00:00Z", "2019-05-02T21:00:00Z", 1),("2019-05-02T09:30:00Z", "2019-05-02T21:00:00Z", 2),("2019-05-02T10:00:00Z", "2019-05-02T21:00:00Z", 3),("2019-05-02T10:30:00Z", "2019-05-02T21:00:00Z", 4),("2019-05-02T09:30:00Z", "2019-05-02T22:00:00Z", 5),("2019-05-02T10:00:00Z", "2019-05-02T22:00:00Z", 6) }它必須返回:{("2019-05-02T09:00:00Z", "2019-05-02T21:00:00Z", 1),("2019-05-02T09:30:00Z", "2019-05-02T22:00:00Z", 5),("2019-05-02T10:00:00Z", "2019-05-02T22:00:00Z", 6) ("2019-05-02T10:30:00Z", "2019-05-02T21:00:00Z", 4) }
查看完整描述

4 回答

?
慕森王

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊

你可以這樣嘗試:


Map<TimeStamp, Optional<Obj>> result = 

         list.stream().collect(Collectors.groupingBy(

                                Obj::getTs,

                                Collectors.maxBy(Comparator.comparing(Obj::getGenerationTs))

         ));

正如@Naman 在評(píng)論中所說(shuō)的更完整的選項(xiàng):


list.stream().collect(Collectors.groupingBy(

                       Obj::getTs,

                       Collectors.maxBy(Comparator.comparing(Obj::getGenerationTs))

              )).values().stream()

                .filter(Optional::isPresent) 

                .map(Optional::get)

                .collect(Collectors.toList());


查看完整回答
反對(duì) 回復(fù) 2022-11-10
?
森欄

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊

您當(dāng)然可以Stream使用地圖收集器然后獲取值來(lái)做到這一點(diǎn)


Collection<Obj> objects = list.stream()

    .collect(Collectors.toMap(Obj::getTimeStamp,

                              Function.identity(),

                              (o1, o2) -> o1.getGenerationTs().isBefore(o2.getGenerationTs()) ? o2 : o1))

    .values();


List<Obj> listOfObjects = new ArrayList<>(objects);

甚至更短:


List<Obj> result = list.stream()

        .collect(Collectors.collectingAndThen(

                Collectors.toMap(Obj::getTimeStamp,

                        Function.identity(),

                        (o1, o2) -> o1.getGenerationTs().isBefore(o2.getGenerationTs()) ? o2 : o1),

                m -> new ArrayList<>(m.values())));


查看完整回答
反對(duì) 回復(fù) 2022-11-10
?
HUX布斯

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊

如果您已經(jīng)有一個(gè)排序列表(按 降序generationTs),就像您在示例代碼中那樣,您可以使用 aHashSet和Collection.removeIf()從該列表中刪除所有重復(fù)的時(shí)間戳:


list.sort(Comparator.comparing(Obj::getTs)

        .thenComparing(Comparator.comparing(Obj::getGenerationTs)

                .reversed()));


Set<Timestamp> keys = new HashSet<>();

list.removeIf(o -> !keys.add(o.getTs()));

使用此解決方案,您不必創(chuàng)建新列表,只需修改您擁有的列表。該集合將您要維護(hù)的所有密鑰存儲(chǔ)在列表中。因?yàn)榱斜硪雅判颍宰钚碌膶?duì)象保留在列表中,而其他值則被刪除。


您共享的數(shù)據(jù)的結(jié)果將是:


Obj[ts=2019-05-02T09:00:00Z, generationTs=2019-05-02T21:00:00Z, value=1]

Obj[ts=2019-05-02T09:30:00Z, generationTs=2019-05-02T22:00:00Z, value=5]

Obj[ts=2019-05-02T10:00:00Z, generationTs=2019-05-02T22:00:00Z, value=6]

Obj[ts=2019-05-02T10:30:00Z, generationTs=2019-05-02T21:00:00Z, value=4]

如果您已經(jīng)有一個(gè)排序列表,則此解決方案應(yīng)該是最快的解決方案之一。


查看完整回答
反對(duì) 回復(fù) 2022-11-10
?
qq_遁去的一_1

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊

下面是一種方法。


將第一個(gè)時(shí)間戳分組,然后使用 maxBy 查找具有最新一代時(shí)間戳的對(duì)象。最后對(duì)第一個(gè)時(shí)間戳進(jìn)行排序并打印出來(lái)。


maxBy 將產(chǎn)生 Optional 的事實(shí)有點(diǎn)難看,但我找不到避免它的方法。


import static java.util.stream.Collectors.groupingBy;

import static java.util.stream.Collectors.maxBy;


import java.time.Instant;

import java.util.Optional;

import java.util.stream.Stream;


import org.junit.jupiter.api.Test;


public class SortTest {


@Test

public void t() {

    final Stream<Obj> s = Stream.of(new Obj("2019-05-02T09:00:00Z", "2019-05-02T21:00:00Z", 1),

            new Obj("2019-05-02T09:30:00Z", "2019-05-02T21:00:00Z", 2),

            new Obj("2019-05-02T10:00:00Z", "2019-05-02T21:00:00Z", 3),

            new Obj("2019-05-02T10:30:00Z", "2019-05-02T21:00:00Z", 4),

            new Obj("2019-05-02T09:30:00Z", "2019-05-02T22:00:00Z", 5),

            new Obj("2019-05-02T10:00:00Z", "2019-05-02T22:00:00Z", 6));


    s.collect(groupingBy(o -> o.ts, maxBy((o1, o2) -> o1.generationTs.compareTo(o2.generationTs))))

    .values()

    .stream()

    .map(Optional::get)

    .sorted((o1, o2) -> o1.ts.compareTo(o2.ts))

    .forEach(System.out::println);


}


private class Obj {

    Instant ts;

    Instant generationTs;

    int i;


    Obj(final String ts, final String generationTs, final int i) {

        this.ts = Instant.parse(ts);

        this.generationTs = Instant.parse(generationTs);

        this.i = i;

    }


    @Override

    public String toString() {

        return String.format("%s %s %d", ts, generationTs, i);

    }

}

}


查看完整回答
反對(duì) 回復(fù) 2022-11-10
  • 4 回答
  • 0 關(guān)注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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