簡體   English   中英

具有一對多關系的比較器

[英]comparator with one to many relation filed

我有一個包含文檔實體列表的 DTO 對象 ClientInfo。

我使用以下比較方法按 documentCreationDate DESC 對 clientInfo 列表進行排序。

    @Override
        public int compareTo(ClientInfo o) {

            Date firstmaxDate = this.getDocuments().stream().map(d -> d.getCreateDate()).max(Date::compareTo).get();
            Date secondmaxDate = o.getDocuments().stream().map(d -> d.getCreateDate()).max(Date::compareTo).get();
            return firstmaxDate.compareTo(secondmaxDate);

        }
List<ClientInfo> clientInfos= serverReturnedList......;
Collections.sort(clientInfos);

但它得到一個例外,告訴比較規則已被違反。 所以我沒有得到預期的結果。 誰能解釋一下實現這一目標的方法。

這是異常堆棧跟蹤

java.util.NoSuchElementException: No value present
        at java.util.Optional.get(Optional.java:135)
        at com.orsbv.hcs.dto.ClientInfo.compareTo(ClientInfo.java:346)
        at com.orsbv.hcs.dto.ClientInfo.compareTo(ClientInfo.java:24)
        at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
        at java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
        at java.util.Arrays.sort(Arrays.java:1312)
        at java.util.Arrays.sort(Arrays.java:1506)
        at java.util.ArrayList.sort(ArrayList.java:1462)
        at java.util.Collections.sort(Collections.java:141)

您應該保留compareTo()方法,因為它按照自然順序(升序)進行排序,這是有道理的。

相反,您應該更改排序,以告訴它以反向(降序)順序排序。

List<ClientInfo> clientInfoList = ...
Collections.sort(clientInfoList, Comparator.reverseOrder());

根據添加到問題的信息更新:

您的某些ClientInfo沒有任何可用於檢查創建日期的文檔。

當你這樣做時:

 Date firstmaxDate = this.getDocuments().stream().map(d -> d.getCreateDate()).max(Date::compareTo)

max()返回一個Optional<Date>允許它在空流的情況下返回Optional.empty() 當您有一個沒有任何文檔的 ClientInfo 時,您會在空的Optional上調用get() ,這會導致此異常。

您需要確定在真實數據中是否會出現這種情況,如果是,您希望如何對沒有文檔的ClientInfo 進行排序。 如果你所有的 createdDates 都是過去的,你可以簡單地用“now”替換“no created date”:

        Date thisDate = this.getDocuments()
                .stream()
                .map(Document::getCreateDate)
                .max(Date::compareTo)
                .orElseGet(Date::new);
        Date otherDate = o.getDocuments()
                .stream()
                .map(Document::getCreateDate)
                .max(Date::compareTo)
                .orElseGet(Date::new);

或者,您可以在get()之前停止,使用Optional<Date>並檢查isPresent()並根據需要進行處理。

首先,我向 clientInfo 添加了一個 maxDocuemntCreationDate 字段。

  Date maxCreationDate = clientInfo.getDocuments()
                        .stream()
                        .map(Document :: getCreateDate)
                        .max(Date::compareTo)
                        .orElseGet(Date::new);

然后我以這種方式比較

 @Override
            public int compareTo(ClientInfo o) {


              return 
              this.getMaxCreationDate().compareTo(o.getMaxCreationDate());

            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM