gpt4 book ai didi

java - 按列表中某些对象中缺少的对象字段对列表进行排序

转载 作者:行者123 更新时间:2023-11-30 06:01:40 25 4
gpt4 key购买 nike

我需要显示帐户对象列表并根据其中一个帐户对象字段(所有字符串类型)进行排序。但是,某些帐户字段值为 null,因此不会显示在 JSON 中。在对那些缺失的字段进行排序时,它给了我一个空指针异常。如何让 Comparator 在排序过程中忽略缺失的字段?

我尝试了Comparator.comparing(),但它仅适用于公共(public)字段(存在于所有帐户对象中)。如果我尝试对帐户对象之一中缺少的字段进行排序。 NullPointerExceptionn 发生。当然,如果我尝试强制所有字段都将这些字段显示为空字符串值(“”),那么它会正常工作,但看起来不太好,因为这些字段可能太多了。

账户定义

@JsonInclude(Include.NON_NULL)
private String type;
@JsonInclude(Include.NON_NULL)
private String accountNumber;
@JsonInclude(Include.NON_NULL)
private String accountStatus;
@JsonInclude(Include.NON_NULL)
private String accountValue;
....

对以下列表进行排序 - 只有类型和 accountNumber 是通用的

"accounts": [
{
"type": "type1",
"accountNumber": "1816227",
"accountStatus": "cancelled",
},
{
"type": "type2",
"accountNumber": "2816218",
"accountValue": "19438.60",

},
{
"type": "type3",
"accountNumber": "2209890",
"accountStatus": "inactive",
"accountValue": "4343.410",
}

  if (sortField.equalsIgnoreCase("type")) {         
accountComparator = Comparator.comparing(Accounts::getType);
}else if(sortField.equalsIgnoreCase("accountNumber")) {
accountComparator = Comparator.comparing(Accounts::getAccountNumber);
}else if(sortField.equalsIgnoreCase("accountStatus")) {
accountComparator = Comparator.comparing(Accounts::getAccountStatus);
}else if(sortField.equalsIgnoreCase("accountValue")) {
accountComparator = Comparator.comparingDouble(acc ->
Double.valueOf(acc.getAccountValue()));
}
......
当对 accountStatus 进行 Sort 时,下一行发生

Nullpointer 异常 其中一个帐户中缺少 accountValuetotalAcctList.sort(accountComparator.reversed());

如上所述,如果我让所有帐户显示 accountStatus 并且 accountValue 例如 "accountStatus":""和 "accountValue":"0.0" 那么它 有效。

最佳答案

您可以决定将所有 null 放在列表的开头或结尾,并使用 Comparator.nullsFirstComparator.nullsLast分别是:

else if (sortField.equalsIgnoreCase("accountStatus")) {
accountComparator =
Comparator.comparing(Accounts::getAccountStatus,
Comparator.nullsLast(Comparator.naturalOrder()));
}

编辑:

对于 accountValue 您可以采取类似的方法,尽管由于原始 double 不能为 null,所以您必须处理它们首先,在尝试解析之前:

else if (sortField.equalsIgnoreCase("accountValue")) {    
accountComparator =
Comparator.comparing((Account a) -> a.getAccountValue() == null)
.thenComparingDouble((Account a) ->
Double.parseDouble(a.getAccountValue()));
}

关于java - 按列表中某些对象中缺少的对象字段对列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56928648/

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