gpt4 book ai didi

Java 多列条件排序

转载 作者:行者123 更新时间:2023-11-30 02:45:15 26 4
gpt4 key购买 nike

我有这个对象 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

最佳答案

说到排序,通常只是关于如何实现比较器。在这种情况下,您只需要一个 Comparator 来按照您描述的方式比较两个 ClientSearch 对象。

如果你能简化你的排序要求,会更干净

  1. 客户编号(最后为空)
  2. 队列 ID,然后
  3. 客户名称

使用 Java 8,比较器将像这样简单:

import static java.util.Comparator.*;
....
Comparator<Customer> comparator =
comparing(Customer::getCustNumber, nullsLast(naturalOrder()))
.thenComparing(Customer::getQueueId)
.thenComparing(Customer::getCustName);

这与您最初要求的有点不同。您要求的是

  1. 如果两者都有客户编号,则比较
    1. 客户数量
    2. 客户名称
  2. 如果两者都没有客户编号,则比较
    1. 队列 ID
    2. 客户名称
  3. 如果一个有客户编号,而另一个没有,则以空客户编号为准。

如果你确实需要你正在寻找的东西,那并不难做到。例如,您可以为不同的情况分别设置两个 Comparator,然后组合为一个 Comparator,看起来像这样(在 Java 8 的帮助下,应该不难如果您有想法,可以为以前的 Java 版本编写一个):

public class ClientSearchComparator implements Comparator<ClientSearch> {
private static Comparator<ClientSearch> custNumberComparator =
Comparator.comparing(ClientSearch::getCustNumber)
.thenComparing(ClientSearch::getCustName);
private static Comparator<ClientSearch> queueIdComparator =
Comparator.comparing(ClientSearch::getQueueId)
.thenComparing(ClientSearch::getCustName);
@Override
public int compare(ClientSearch c1, ClientSearch c2) {
if (c1.getCustNumber() != null && c2.getCustNumber() != null) {
return custIdComparator.compare(c1, c2);
} else if (c1.getCustNumber() == null && c2.getCustNumber() == null) {
return queueIdComparator.compare(c1, c2);
} else if (c1.getCustNumber() != null && c2.getCustNumber() == null) {
return -1;
} else { // (c1.getCustNumber() == null && c2.getCustNumber() != null)
return 1;
}
}
}

(我相信我不需要告诉您如何使用 Comparator 进行排序,对吧?)

<小时/>

更新:正如您所提到的,您正在使用 Java 6,以下是比较器的基本概念(伪代码):

public class ClientSearchComparator implements Comparator<ClientSearch> {
@Override
public int compare(ClientSearch c1, ClientSearch c2) {
if (c1.custNum != null && c2.custNum != null) {
if (c1.custNum != c2.custNum) {
return c1.custNum.compareTo(c2.custNum);
}
return c1.custName.compareTo(c2.custName);
} else if (c1.custNum == null && c2.custNum == null) {
if (c1.queueId != c2.queueId) {
return c1.queueId .compareTo(c2.queueId);
}
return c1.custName.compareTo(c2.custName);
} else if (c1.custNum == null) { // c1 null && c2 not null
return 1;
} else { // c1 not null && c2 null
return -1;
}
}

(通过一些重组,或者借助 Guava 或 Apache Common Langs 等工具,它看起来会更好)

关于Java 多列条件排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40373644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com