亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據嵌套對象的多次比較進行流排序?

如何根據嵌套對象的多次比較進行流排序?

海綿寶寶撒 2023-10-13 14:50:37
型號示例:我需要根據駕駛員的性別和年齡對汽車流進行排序。public class Car {    String color;    Driver driver; }public class Driver {    String name;    Integer age;    String gender;  }public List<Car> sortCars(List<Car> cars) {    return cars.stream()        .sorted(Comparator                .comparing(car -> -1 /* car.getDriver().getGender() */ )                .thenComparing(car -> -1 /* car.getDriver().getAge() */ ))        .collect(Collectors.toList());}我不想創建特殊的比較器類或實現比較器接口。我的用例可能嗎?過去一個小時我一直在瀏覽 SO,但沒有一個答案有效。
查看完整描述

2 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

可能類型推斷不夠強大。這對我有用:

return cars.stream()
        .sorted(Comparator.comparing(car -> ((Car) car).getDriver().getGender())
                .thenComparingInt(car -> ((Car) car).getDriver().getAge()))
        .collect(Collectors.toList());


查看完整回答
反對 回復 2023-10-13
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

如果你想避免強制轉換,你還有兩個選擇:

選項1:

 Comparator<Car> com1 = Comparator.comparing(car -> car.getDriver().getGender());
 Comparator<Car> com2 = Comparator.comparing(car -> car.getDriver().getAge());

然后:

cars.stream().sorted(com1.thenComparing(com2)).collect(Collectors.toList());

選項2:

讓編譯器知道您正在比較Cars:

cars.stream().sorted(Comparator.comparing((Car car) -> car.getDriver().getGender())
    .thenComparing(car -> car.getDriver().getAge()))
                    .collect(Collectors.toList());

編輯:實際上,您還有更多選擇。根據 @Andreas 的評論,您可以傳遞類型Comparator.<Car, String>comparing,也可以編寫自己的comparing函數,如下所示:

sorted((car1, car2) -> {/*function body that returns -1, 0, 1 */}

另外,如果你想List<Car>排序,可以直接使用sort()方法:

cars.sort(com1.thenComparing(com2));


查看完整回答
反對 回復 2023-10-13
  • 2 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號