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

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

Java 8 - 基于特定順序的自定義排序

Java 8 - 基于特定順序的自定義排序

瀟瀟雨雨 2022-01-12 17:18:44
我想根據用戶的狀態對用戶列表進行排序,但順序必須基于我設置的順序。我想設置列表的順序,順序應該是1, 0 , 5。我們還應該記住訂購用戶名。List<User> users = new ArrayList();         users.add(new User("A", 1));         users.add(new User("B", 5));         users.add(new User("C", 0));         users.add(new User("D", 1));         users.add(new User("E", 5));         users.add(new User("F", 0));這是用戶類public class User {         private String username;         private Integer status;     }它應該看起來像這樣[    {      "username": "A",      "status": 1    },    {       "username": "D",       "status": 1    },    {       "username": "C",       "status": 0    },    {       "username": "F",       "status": 0    },    {       "username": "B",       "status": 5    },    {       "username": "E",       "status": 5    }]我不確定是否可以使用Comparator.comparing,因為這個既不是升序也不是降序。
查看完整描述

3 回答

?
月關寶盒

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

一種方法可能是按照您想要的順序保存一個列表,并根據其索引對用戶進行排序:


final List<Integer> order = Arrays.asList(1, 0, 5);

users.sort(

    Comparator.comparing((User u) -> order.indexOf(u.getStatus()))

              .thenComparing(User::getUsername));

請注意,雖然這種方法對于少數狀態(就像您目前擁有的那樣)應該是合理的,但如果有大量狀態并且您每次都需要執行 O(n) 搜索,它可能會減慢排序速度。一種性能更好的方法(盡管可以說沒有那么圓滑)是使用地圖:


final Map<Integer, Integer> order = new HashMap<>();

order.put(1, 0);

order.put(0, 1);

order.put(5 ,2);

users.sort(Comparator.comparing((User u) -> order.get(u.getStatus()))

                     .thenComparing(User::getUsername));


查看完整回答
反對 回復 2022-01-12
?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

如果你不介意在你的項目中使用 Guava,你可以使用Ordering.explicit:


users.sort(Ordering.explicit(1, 0, 5).onResultOf(User::getStatus));

如果您還想按名稱排序,請添加thenComparing:


users.sort(Ordering

        .explicit(1, 0, 5)

        .onResultOf(User::getStatus)

        .thenComparing(User::getUsername));


查看完整回答
反對 回復 2022-01-12
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

假設1,05will 是 的唯一值status,AJNeufeld 在他們的評論中提出了一個極好的觀點;他們說您可以使用方程式將每個值映射到升序。在這種情況下,等式將是 的值在(x - 1)^2哪里:xstatus

users.sort(Comparator.comparingDouble(user -> Math.pow(user.getStatus() - 1, 2)));

如果您要user在調用上述代碼段后打印 的內容,您會得到:

[用戶[用戶名=A,狀態=1],用戶[用戶名=D,狀態=1],用戶[用戶名=C,狀態=0],用戶[用戶名=F,狀態=0],用戶[用戶名=B , 狀態=5], 用戶 [用戶名=E, 狀態=5]]


查看完整回答
反對 回復 2022-01-12
  • 3 回答
  • 0 關注
  • 643 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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