使用Guava的ComparisonChain比较包含罗马数字的字符串

时间:2011-12-12 21:14:09

标签: java comparison guava comparisonchain

我有实现Comparator<String>的类,它应该以这样的方式对字符串进行排序,即第一个单词为罗马数字的字符串应该在不以罗马数字开头的字符串之前,并且如果两个字符串都以罗马文字开头,那么应该是两个案例:

  1. 按罗马数字排序,然后按其余字符串
  2. 排序
  3. 按其余字符串排序,如果等于罗马数字
  4. 我想使用Guava的ComparisonChain但遇到两个问题:

    1. 在Eclipse中调试期间,我无法看到ComparisonChain对象中的内容(即使在ComparisonChain类中)。
    2. 上面第二个例子中的
    3. comparisonChain.result()总是返回0(由于问题#1,我无法检查流量),例如“XI Something”,“I​​II Something”等等(转换为long就可以了 - 我检查值)。
    4. 这是什么问题?我可以像上面那样使用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吗?

1 个答案:

答案 0 :(得分:11)

compare的每个ComparisonChain方法都返回一个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