[英]Using Guava's ComparisonChain to compare strings containing roman numbers
我有實現Comparator<String>
,它應該以這樣的方式對字符串進行排序,即第一個單詞為羅馬數字的字符串應該在不以羅馬數字開頭的字符串之前,如果兩個字符串都以羅馬文字開頭,則應該有兩種情況:
我想使用Guava的ComparisonChain但遇到兩個問題:
comparisonChain.result()
總是返回0(由於問題#1,我無法檢查流量),例如“XI Something”,“III Something”等等(轉換為long就可以 - 我檢查了值) 。 這里有什么問題? 我可以像上面一樣使用comparisonChain
對象(通過在構造函數中使用變量和添加.compare
s),不是嗎?
這段代碼:
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
嗎?
ComparisonChain
每個compare
方法都返回一個ComparisonChain
,它不一定是調用compare的鏈。 第一個片段不會忽略結果(因此是正確的),但第二個忽略結果,因此是不正確的。
如果這樣做會是正確的:
comparisionChain = comparisionChain.compare(...).compare(...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.