Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用嵌套对象执行Collections.sort()时如何处理空值?_Java_Sorting_Collections_Null - Fatal编程技术网

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 < /代码>的想法。我仔细研究了一下,我认为这可能会派上用场(如果我使用的是Apache commons)。是的,您不必编写显式空检查,因为所有内容都已处理。但是,它不会自动处理嵌套对象。但还是很方便。而且不需要包含整个ApacheCommons库,它足以实现您自己的
NullComparator
ComparableComparator
类。ApacheCommons的代码可以在网上找到。Downvoter,你能对我的答案提出改进意见吗