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));

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));

TA貢獻1874條經驗 獲得超12個贊
假設1
,0
和5
will 是 的唯一值status
,AJNeufeld 在他們的評論中提出了一個極好的觀點;他們說您可以使用方程式將每個值映射到升序。在這種情況下,等式將是 的值在(x - 1)^2
哪里:x
status
users.sort(Comparator.comparingDouble(user -> Math.pow(user.getStatus() - 1, 2)));
如果您要user
在調用上述代碼段后打印 的內容,您會得到:
[用戶[用戶名=A,狀態=1],用戶[用戶名=D,狀態=1],用戶[用戶名=C,狀態=0],用戶[用戶名=F,狀態=0],用戶[用戶名=B , 狀態=5], 用戶 [用戶名=E, 狀態=5]]
添加回答
舉報