在嵌套对象上执行null
时,处理Collections.sort()
值的最佳方法是什么?
我想对几个对象进行排序,基本上应用这个规则:
@Override
public int compare(final InvoicePos invoicePosOne, final InvoicePos invoicePosTwo) {
return invoicePosOne.getInvoice().getInvoiceNo().compareTo(invoicePosTwo.getInvoice().getInvoiceNo());
}
但是,这些对象中的任何一个都可以是null
(即发票位置,发票和发票号码)。
public class InvoicePos {
private Invoice invoice = null;
// ...
}
public class Invoice {
private String invoiceNo = "";
// ...
}
我是否做过明确的null
- 检查我的所有对象,或者是否采用较少写作的方法?
澄清:我知道上面的例子可能会引发NullPointerExceptions。目前我正在做以下事情,基本上,我质疑自己,如果有更聪明的方法。
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());
}
});
答案 0 :(得分:1)
我是否做过明确的
null
- 检查我的所有对象,或者是否采用较少写作的方法?
如果这些价值观不能代表您收藏中的任何内容,那么您可以做的最好的事情就是避免它们;不允许插入它们,因此在比较项目时你不必处理它们。
如果您坚持要求,必须检查他们是否null
以避免NullPointerException
。
答案 1 :(得分:1)
org.apache.commons.collections.jar中有一些名为 NullComparator 的内容。
答案 2 :(得分:0)
如果您有空值,则需要以一致的方式显式处理它们,以便具有有效的排序关系。就是这样:
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);
}
会打破排序关系。