我想根据用户状态对用户列表进行排序,但顺序必须基于我设置的顺序。
我想设置列表的顺序,
顺序应该是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,因为这个既不是升序也不是降序。
最佳答案
一种方法是按照您想要的顺序保存一个列表,并根据其索引对用户进行排序:
final List<Integer> order = Arrays.asList(1, 0, 5);
users.sort(
Comparator.comparing((User u) -> order.indexOf(u.getStatus()))
.thenComparing(User::getUsername));
请注意,虽然这种方法对于少量状态(如您目前拥有的)应该是合理的,但如果有大量状态并且您需要对每个状态执行 O(n) 搜索,它可能会减慢排序速度时间。一种性能更好的方法(尽管可以说不是那么圆滑)是使用 map :
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));
关于Java 8 - 基于特定顺序的自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53255793/