1

我对 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) 我应该使用比较器吗?

快乐的编程...

4

4 回答 4

4

要解决您的具体问题:

  1. 是的,看起来不错。结果不必是 -1、0 或 1。不过,您的代码可能会稍微不那么冗长,只要找到结果就返回,根本不使用comparison变量。
  2. 如果您正在实施Comparable,则无需处理Comparator. 它适用于当您需要比较不需要Comparable或需要以不同方式比较的东西时。

GuavaComparisonChain类使这样的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();
}
于 2011-04-18T04:13:29.327 回答
2

(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 的更轻的解决方案。

于 2011-04-18T02:08:41.400 回答
0
  1. 根据可比文档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 是一个有效的结果。

  2. 这是一个偏好问题,真的。我个人更喜欢使用 a Comparator,但compareTo()效果也一样。无论哪种情况,您的代码看起来都差不多。

于 2011-04-18T02:10:27.590 回答
0

您的 compareTo 足够合理。compareTo 可以返回 -1,0,1 以外的值。只是负数、0 和正数。

您应该使用比较器。

于 2011-04-18T02:09:18.593 回答