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]]
添加回答
举报