2011-12-12 86 views
3

我有一個類實現Comparator<String>,它應該以這樣的方式對字符串進行排序,使得第一個字詞爲羅馬數字的字符串應該在不以羅馬數字開頭的字符串之前,並且如果兩個字符串都開始用羅馬文字,應該有兩種情況:使用Guava's ComparisonChain比較包含羅馬數字的字符串

  1. 排序的羅馬數字,然後如果等於由串
  2. 排序字符串的休息休息,不是羅馬數字

我萬特相同的,當d利用番石榴的ComparisonChain但遇到了兩個問題:

  1. 調試期間在Eclipse中我看不到有什麼ComparisonChain對象內(即便在ComparisonChain類是)。
  2. comparisonChain.result()在上面的第二個例子中,對於諸如「XI Something」,「I​​II Something」等值的值(轉換爲long是OK - 我檢查了值)總是返回0(因爲問題#1,我無法檢查流)。

這裏有什麼問題?我可以使用上面的comparisonChain這樣的對象(通過在一些像建設者一樣的變量中添加.compare),不是嗎?

此代碼:

if (romanComparisionFirst) { 
    return ComparisonChain.start() 
     .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord)) 
     .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator) 
     .result(); 
    } else { 
    return ComparisonChain.start() 
     .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator) 
     .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord)) 
     .result(); 
    } 

這:

final ComparisonChain comparisionChain = ComparisonChain.start(); 
    if (romanComparisionFirst) { 
    comparisionChain 
     .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord)) 
     .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator); 
    } else { 
    comparisionChain 
     .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator) 
     .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord)); 
    } 
    return comparisionChain.result(); 

得到不同的結果 - 第一種情況是好的,第二個總是0,所以問題是:我可以使用ComparisonChain如果第二齣樣或者這種行爲是一個錯誤?

+0

不是一個真正的答案(JB是完全正確的),但我可以建議有兩個單獨的排序 - 一個羅馬人的話,另一個是尾巴? – Ray

回答

11

ComparisonChain的每個compare方法返回一個ComparisonChain,它不一定是調用比較的鏈。第一個片段不會忽略結果(因此是正確的),但第二個片段忽略結果,因此不正確。

如果沒有這將是正確的:

comparisionChain = comparisionChain.compare(...).compare(...); 

的源代碼見http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/src-html/com/google/common/collect/ComparisonChain.html#line.89

+0

所以基本上'ComparisonChain'不能用作'Immutable * .Buider'嗎?我的意思是'最後的生成器 builder = ImmutableSet.builder();'然後'if(condition){builder.add(element);'?這是爲什麼? – Xaerxess

+0

(不能編輯上面的註釋)爲什麼在調用'compareChain.result()'的時候不計算結果?我的意思是這個概念,我可以看到代碼解釋我的錯誤:) – Xaerxess

+0

那麼,這就是番石榴決定實施比較鏈。它使事情變得簡單一些,只要前一個已經找到結果就忽略任何後續比較。 –