多列排序(升序)问题的compareTo()和Collections.sort()解决方案

| 与Java的compareTo()和Collections.sort()行为有些混淆。 我应该使用compareTo()和Collections.sort()以升序对列进行排序。 我的标准是(如果出现相同的数字,请排序下一个可用的列)。 (1)证件编号 (2)张贴日期 (3)交易日期 (4)交易参考号比较 这是实现Collection.sort()方法的代码(在调用方法中执行):
public int compareTo(CreditCardTransactionDetail t) {
   int comparison = 0;

   int documentNumberComparison = this.getDocumentNumber().compareTo(t.getDocumentNumber());
   if (documentNumberComparison != 0) {
       comparison = documentNumberComparison;
   } 
   else {
       int postingDateComparison = this.getTransactionPostingDate().compareTo(t.getTransactionPostingDate());
       if (postingDateComparison != 0) {
           comparison = postingDateComparison;
       } 
       else {
           int transactionDateComparison = this.getTransactionDate().compareTo(t.getTransactionDate());
           if (transactionDateComparison != 0) {
               comparison = transactionDateComparison;
           }
           else {
               int transactionRefNumberComparison = this.getTransactionReferenceNumber().compareTo(t.getTransactionReferenceNumber());
               LOG.info(\"\\n\\n\\t\\ttransactionRefNumberComparison = \" + transactionRefNumberComparison + \"\\n\\n\");
               if (transactionRefNumberComparison != 0) {
                   comparison = transactionRefNumberComparison;
               }
           }
       }
    return comparison;
}
问题: (1)我做对了吗?当比较= 0时,它返回-2。这是正确的行为,因为我一直认为它在-1,0,1之间。 (2)我应该使用比较器吗? 编程愉快...     
已邀请:
要解决您的特定问题: 是的,看起来不错。结果不必是-1、0或1。尽管如此,您的代码可能稍微冗长一些,只要找到结果就立即返回,而无需使用
comparison
变量。 如果您要实施
Comparable
,则无需处理
Comparator
。适用于需要比较不是2英镑的东西或需要以其他方式进行比较的情况。 Guava的ComparisonChain类使这样的
compareTo
方法变得非常简单:
public int compareTo(CreditCardTransactionDetail o) {
  return ComparisonChain.start()
      .compare(getDocumentNumber(), o.getDocumentNumber())
      .compare(getTransactionPostingDate(), o.getTransactionPostingDate())
      .compare(getTransactionDate(), o.getTransactionDate())
      .compare(getTransactionReferenceNumber(), o.getTransactionReferenceNumber())
      .result();
}
    
回答(1):正确。请参见Comparator.compare(T,T)的javadoc:\“第一个参数小于,等于或大于第二个参数的负整数,零或正整数。” 或使用封装了Comparator的Google Guava,以实现更轻松,更强大的用法:
  //Write 4 Comparators for each comparable field
 Ordering ordering = Ordering.from(comparatorDocumentNumber)
    .compound(comparatorTransactionPostingDate)
    .compound(comparatorTransactionDate)
    .compound(comparatorTransactionReferenceNumber);
 Collections.sort(list, ordering);
它使每个比较器解耦,很容易更改/添加/删除字段顺序。 编辑:请参阅ColinD的更轻的解决方案。     
您的compareTo足够合理。 compareTo可以返回-1,0,1以外的值。只是负数,0和正数。 您应该使用比较器。     
根据可比文件,
compareTo()
Returns a negative integer, zero, or a positive integer as this object 
is less than, equal to, or greater than the specified object.
所以-2是有效的结果。 确实,这是一个偏好问题。我个人更喜欢使用prefer3ѭ,但是
compareTo()
也可以。无论哪种情况,您的代码看起来都差不多。     

要回复问题请先登录注册