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. Comparable Documentationによると、次のようになり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. それは好みの問題です、本当に。個人的には を使用することを好みますComparatorcompareTo()、同様に機能します。どちらの場合でも、コードはほとんど同じように見えます。

于 2011-04-18T02:10:27.590 に答える
0

あなたのcompareToは十分に合理的です。compareTo は -1,0,1 以外の値を返すことができます。マイナス、0、プラスだけです。

コンパレータを使用する必要があります。

于 2011-04-18T02:09:18.593 に答える