賞金將在 6 天后到期。此問題的答案有資格獲得 50聲望賞金。 user754730希望引起對這個問題的更多關注。
我有以下代碼:
list.sort(Comparator
.comparing(ProgrammData::getEnd)
.thenComparing(ProgrammData::getStart).reversed());
我的問題是我想讓我的串列按多項排序:1.)將它們分組為未來事件和過去事件(通過檢查 System.currentMilliseconds() 是否大于結束時間戳)2.)對未來事件進行排序開始升序 3.) 通過結束降序對過去的事件進行排序
我可以使用 Java 8 Lambda 執行此操作,還是需要其他方式對專案進行排序?
例子:
events could look like this:
name, start, end
event1, 2022-02-220100, 2022-02-220300
event2, 2022-02-220200, 2022-02-241800
event3, 2022-02-251200, 2022-02-281500
event4, 2022-02-261600, 2022-02-262100
if now() is 2022-02-221200 So the order should be:
event3 (next item in the future)
event4 (2nd next item in the future)
event2 (Ended closer to now than event1)
event1 (Longest in the past)
uj5u.com熱心網友回復:
嘗試這個 :
final long currentTime = System.currentTimeMillis();
list.sort((el1, el2) -> {
if (el1.equals(el2)) {
return 0;
}
boolean isEl1Future = el1.getEnd().getTime() > currentTime;
boolean isEl2Future = el2.getEnd().getTime() > currentTime;
if (isEl1Future != isEl2Future) {
return isEl1Future ? -1 : 1;
}
if (Boolean.TRUE.equals(isEl1Future)) {
return el1.getStart().before(el2.getStart()) ? -1 : 1;
}
return el1.getEnd().after(el2.getEnd()) ? -1 : 1;
});
uj5u.com熱心網友回復:
有很多事情需要注意。首先,一種是.thenComparing(...)方法,它只有在之前的比較結果相等的情況下才會發生。您可以在docs中閱讀有關其行為的更多資訊。
其次,如果我是你,如果我能用一個簡單的比較器解決它,我就不會費心過度使用流。假設您正在尋找ProgrammData串列的新實體,我以流樣式撰寫代碼,但 Comparator 可以與List'sort方法一起使用。
private List<ProgrammData> sortedProgramms(List<ProgrammData> dataList) {
final LocalDateTime now = LocalDateTime.now();
return dataList.stream()
.sorted((e1, e2) -> {
if (e1.getStart().isAfter(now) && e2.getStart().isAfter(now)) {
return e1.getStart().compareTo(e2.getStart());
}
return e2.getEnd().compareTo(e1.getEnd());
})
.collect(Collectors.toList());
}
如果沒有更準確的給定時鐘,LocalDateTime().now() 在內部使用 System.currentTimeMillis()。
uj5u.com熱心網友回復:
您需要將過去和未來的事件拆分到不同的串列中,并相應地對它們進行排序。最后一步是加入兩個串列。
public static void main(String[] args) {
ProgrammData programmData1 = new ProgrammData("a", LocalDateTime.now().plusDays(1),
LocalDateTime.now().plusDays(1));
ProgrammData programmData2 = new ProgrammData("b", LocalDateTime.now().plusDays(2),
LocalDateTime.now().plusDays(2));
ProgrammData programmData3 = new ProgrammData("c", LocalDateTime.now().minusDays(1),
LocalDateTime.now().minusDays(1));
ProgrammData programmData4 = new ProgrammData("c", LocalDateTime.now().minusDays(2),
LocalDateTime.now().minusDays(2));
List<ProgrammData> programmDataList = new ArrayList<>();
programmDataList.add(programmData1);
programmDataList.add(programmData2);
programmDataList.add(programmData3);
programmDataList.add(programmData4);
final List<ProgrammData> collect = programmDataList.stream().sorted(Comparator
.comparing(ProgrammData::end)).toList();
LocalDateTime localDateTime = LocalDateTime.now();
final List<ProgrammData> pastEvents = collect.stream().filter(pd -> pd.end.isBefore(localDateTime))
.sorted(Comparator
.comparing(ProgrammData::end).reversed()).toList();
final List<ProgrammData> futureEvents = collect.stream().filter(pd -> pd.end.isAfter(localDateTime)).toList();
List<ProgrammData> sortedListAsRequired = new ArrayList<>();
sortedListAsRequired.addAll(futureEvents);
sortedListAsRequired.addAll(pastEvents);
System.out.println(sortedListAsRequired);
}
static record ProgrammData(String name, LocalDateTime start, LocalDateTime end) {
}
結果是這樣的:
[ProgrammData[name=a, start=2022-02-23T18:08:59.564300200, end=2022-02-23T18:08:59.568806900], ProgrammData[name=b, start=2022-02-24T18:08:59.568806900, end=2022-02-24T18:08:59.568806900], ProgrammData[name=c, start=2022-02-21T18:08:59.568806900, end=2022-02-21T18:08:59.568806900], ProgrammData[name=c, start=2022-02-20T18:08:59.568806900, end=2022-02-20T18:08:59.568806900]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/430976.html
下一篇:Kinesis:一個Webhook出現“呼叫PutRecord操作時出現(ValidationException)”錯誤。然而另一個Webhook成功了
