【发布时间】:2016-11-02 06:23:53
【问题描述】:
我有这个对象 ClientSearch
public class ClientSearch{
private Long clientNumber;
private String queueNumber;
private String clientName;
private String customerName;
.....
}
我需要按照这个规则来排序:
先显示clientNumber降序,然后按customerName降序显示所有带有clientNumber的记录后,按queueNumber降序排序,customerName降序排序。
这应该是结果 --- ClientNumber desc then, CustomerName desc, then, QueueNumber desc then, CustomerName desc
ClientNumber ClientName CustomerName
987654 Client1 Xyz1
987654 Client2 Abc2
555555 Client3 zzzzz1
21212 XYZ1 aaaab
111111 Client10 cZ
111111 Client11 cY
Z1Z1Z1 ClientX zzzzz
Z1Z1Z1 ClientY yyyyy
X2X2X2 Clienxyz aaaaaa
HHHHHH ClientH bbbbbb
AAAAAA ClientA xxxxxx
基本上每个 ClientSearch 对象都有一个 clientNumber 或一个 queueNumber(如果没有客户编号,那么 queuNumber 被认为是一个客户编号,这就是它显示在该列下的原因),
我想做的是,在我从查询中收到一个列表后(我无法控制,我只是收到了列表),我将使用条件遍历列表。
if clientNumber is present then add to a List<ClientSearch> withClientNumbers
else if queueNumber is present then add to a List<ClientSearch> withQueueNumbers
完成此操作后,我将使用比较器对 withClientNumbers 进行排序,该比较器比较 ClientSearch 的 clientNumber,然后如果它们等于零,我将再次与 ClientSearch 的 customerName 进行比较。我只需要将它们与 -1 相乘以确保它是 DESC。
我将对 queueNumbers 做同样的事情,但使用不同的比较器。
然后我会创建一个新的列表 newList 然后会这样做
newList.addAll(withClientNumbers); //make sure this is first in the list
newList.addAll(queueNumbers); // so to satisfy the condition that queueNumbers are shown after a sorted clientNumbers.
您能建议任何其他优雅的方式来做到这一点吗?我觉得我的方法不是最优化的。请注意,我使用的是 Java 1.6
【问题讨论】:
-
在您的表格中您显示了“clientName”,但在您的文字描述中,您在两种情况下都使用了“customerName”。你能澄清一下吗?而且,让 Comparator 比较 ClientNumber (null last) 然后 Queue Number 然后 Customer Name 有什么问题?
-
对于任何阅读本文并且可以使用 Java 8 的人的注意事项:有一种非常优雅的链接比较条件的方法:
humans.sort(Comparator.comparing(Human::getName).thenComparing(Human::getAge));请参阅baeldung.com/java-8-sort-lambda 以获取完整说明
标签: java sorting comparator