簡體   English   中英

使用Guava的ComparisonChain比較包含羅馬數字的字符串

[英]Using Guava's ComparisonChain to compare strings containing roman numbers

我有實現Comparator<String> ,它應該以這樣的方式對字符串進行排序,即第一個單詞為羅馬數字的字符串應該在不以羅馬數字開頭的字符串之前,如果兩個字符串都以羅馬文字開頭,則應該有兩種情況:

  1. 按羅馬數字排序,然后等於字符串的其余部分
  2. 按字符串的其余部分排序,如果等於羅馬數字

我想使用Guava的ComparisonChain但遇到兩個問題:

  1. 在Eclipse中調試期間,我無法看到ComparisonChain對象中的內容(即使在ComparisonChain類中)。
  2. 上面第二個例子中的comparisonChain.result()總是返回0(由於問題#1,我無法檢查流量),例如“XI Something”,“I​​II 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(...);

有關源代碼,請參閱http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/src-html/com/google/common/collect/ComparisonChain.html#line.89

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM