Java 使用嵌套对象执行Collections.sort()时如何处理空值?
在嵌套对象上执行Java 使用嵌套对象执行Collections.sort()时如何处理空值?,java,sorting,collections,null,Java,Sorting,Collections,Null,在嵌套对象上执行Collections.sort()时,处理null值的最佳方法是什么? 我想对几个对象进行排序,基本上应用这个规则: @Override public int compare(final InvoicePos invoicePosOne, final InvoicePos invoicePosTwo) { return invoicePosOne.getInvoice().getInvoiceNo().compareTo(invoicePosTwo.getInvoice(
Collections.sort()
时,处理null
值的最佳方法是什么?
我想对几个对象进行排序,基本上应用这个规则:
@Override
public int compare(final InvoicePos invoicePosOne, final InvoicePos invoicePosTwo) {
return invoicePosOne.getInvoice().getInvoiceNo().compareTo(invoicePosTwo.getInvoice().getInvoiceNo());
}
但是,这些对象中的任何一个都可以是null
(即发票位置、发票和发票编号)
我是否必须对所有对象执行显式null
-检查,或者是否有一种写入更少的方法
澄清一下:我知道我上面的例子可能会引发NullPointerException。目前我正在做以下工作,基本上,我问自己,是否有更聪明的方法
Collections.sort(allInvoicePositions, new Comparator<InvoicePos>() {
@Override
public int compare(final InvoicePos invoicePosOne, final InvoicePos invoicePosTwo) {
if (null == invoicePosOne && null == invoicePosTwo) {
return 0;
}
if (null == invoicePosOne) {
return -1;
}
if (null == invoicePosTwo) {
return 1;
}
if (null == invoicePosOne.getInvoice() && null == invoicePosTwo.getInvoice()) {
return 0;
}
if (null == invoicePosOne.getInvoice()) {
return -1;
}
if (null == invoicePosTwo.getInvoice()) {
return 1;
}
if (null == invoicePosOne.getInvoice().getInvoiceNo() && null == invoicePosTwo.getInvoice().getInvoiceNo()) {
return 0;
}
if (null == invoicePosOne.getInvoice().getInvoiceNo()) {
return -1;
}
if (null == invoicePosTwo.getInvoice().getInvoiceNo()) {
return 1;
}
return invoicePosOne.getInvoice().getInvoiceNo().compareTo(invoicePosTwo.getInvoice().getInvoiceNo());
}
});
Collections.sort(allInvoicePositions,newcomparator(){
@凌驾
公共整数比较(最终发票POS invoicePosOne、最终发票POS INVOICEPOSWO){
if(null==invoicePosOne&&null==invoicePosTwo){
返回0;
}
if(null==invoicePosOne){
返回-1;
}
if(null==invoicePosTwo){
返回1;
}
if(null==invoicePosOne.getInvoice()&&null==invoicePosTwo.getInvoice()){
返回0;
}
if(null==invoicePosOne.getInvoice()){
返回-1;
}
if(null==invoicePosTwo.getInvoice()){
返回1;
}
if(null==invoicePosOne.getInvoice().getInvoiceNo()&&null==invoicePosTwo.getInvoice().getInvoiceNo()){
返回0;
}
if(null==invoicePosOne.getInvoice().getInvoiceNo()){
返回-1;
}
如果(null==invoicePosTwo.getInvoice().getInvoiceNo()){
返回1;
}
返回invoicePosOne.getInvoice().getInvoiceNo().compareTo(invoicePosTwo.getInvoice().getInvoiceNo());
}
});
我是否必须对所有对象执行显式null
-检查,或者是否有一种写入更少的方法
如果这些值在您的集合中不代表任何内容,那么您可以做的最好的事情就是避免它们;不允许插入它们,因此在比较项目时不必处理它们
如果您坚持要使用它们,则必须检查它们是否为空,以避免出现。如果您有空值,则需要以一致的方式显式处理它们,以获得有效的排序关系。也就是说,类似于:
compare (a, b) {
if (a == null && b == null) return 0;
if (a == null) return -1;
if (b == null) return +1;
return comp(a,b);
}
compare (a, b) {
if (a == null || b == null) return -1;
return comp(a,b);
}
不要被诱惑去做以下事情:
compare (a, b) {
if (a == null && b == null) return 0;
if (a == null) return -1;
if (b == null) return +1;
return comp(a,b);
}
compare (a, b) {
if (a == null || b == null) return -1;
return comp(a,b);
}
这将破坏排序关系。在org.apache.commons.collections.jar中有一个名为NullComparator的东西
这可能会对您有所帮助。好吧,不要允许在集合中插入
null
值。另外,如果您知道某些字段可能是null
,请检查比较器,否则请确保您根本没有null
值。是的,否则您将在invoicePosOne.getInvoice().getInvoiceNo()
-->(getInvoice())中得到NPE
返回一个发票的实例
对吗?。因此,如果它返回null
,那么您将有一个NPE)问题是排序顺序需要一致。i、 e.如果你决定aa也必须是真的。你必须选择NULL NullComparator
和ComparableComparator
类。ApacheCommons的代码可以在网上找到。Downvoter,你能对我的答案提出改进意见吗