使用嵌套对象执行Collections.sort()时如何处理空值?

时间:2015-01-20 14:45:32

标签: java sorting collections null

在嵌套对象上执行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());
        }
     });

3 个答案:

答案 0 :(得分:1)

  

我是否做过明确的null - 检查我的所有对象,或者是否采用较少写作的方法?

如果这些价值观不能代表您收藏中的任何内容,那么您可以做的最好的事情就是避免它们;不允许插入它们,因此在比较项目时你不必处理它们。

如果您坚持要求,必须检查他们是否null以避免NullPointerException

答案 1 :(得分:1)

org.apache.commons.collections.jar中有一些名为 NullComparator 的内容。

这可能对您https://commons.apache.org/proper/commons-collections/javadocs/api-2.1.1/org/apache/commons/collections/comparators/NullComparator.html有帮助。

答案 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);
}

会打破排序关系。