2011-04-18 70 views
2

與Java的compareTo()和Collections.sort()行爲有些混淆。compareTo()和Collections.sort()解決方案多列排序(升序)問題

我應該使用compareTo()& Collections.sort()以升序對列進行排序。

我的標準是(如果出現相同的數字,請對下一個可用列進行排序)。

(1)文件號 (2)過帳日期 (3)交易日期 (4)交易參考編號比較

下面的代碼(其在呼叫方法執行)實現該集合。 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; 
} 

問題(S):

(1)我做了正確的事情?當比較= 0時,它返回爲-2。這是正確的行爲,因爲我一直認爲它在-1,0,1之間。

(2)我應該使用比較器嗎?

快樂編程...

回答

2

回答(1):這是正確的。見Comparator.compare的javadoc的(T,T):「負整數,零或正整數作爲第一個參數大於第二小於,等於或大於。」

或者使用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的打火機解決方案。

+1

寫了4個比較似乎浪費,除非你確實需要能夠比較所有4分不同的方式。如果你這樣做,那麼將它們與「複合」相結合是很好的...如果不是這樣,比較鏈是真正實現番石榴最好的方法。 – ColinD 2011-04-18 04:15:11

+0

@ColinD:完全同意! – 2011-04-18 04:22:29

0

你比較合理。 compareTo可以返回-1,0,1以外的值。只是消極的,0和積極的。

您應該使用比較器。

0
  1. 按照Comparable DocumentationcompareTo()

    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. 這是一個偏好問題,真的。我個人更喜歡使用Comparator,但compareTo()也適用。無論哪種情況,你的代碼看起來都差不多。

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(); 
}