我有一个实现Comparator<String>的类,该类应按以下方式对字符串进行排序:第一个单词为罗马数字的字符串应在不以罗马数字开头的字符串之前,并且如果两个字符串都以罗马文字开头,则应该有两种情况:

  • 按罗马数字排序,如果相等则按其余字符串
  • 排序
  • 按其余字符串排序,如果等于罗马数字

  • 我想使用番石榴的ComparisonChain,但遇到两个问题:
  • 在Eclipse中进行调试期间,我看不到CompareChain对象内部的内容(即使在处于ComparisonChain类中时)。
  • 上面第二个示例中的
  • comparisonChain.result()始终为诸如“XI Something”,“III Something”等值返回0(由于问题#1,我无法检查流)(转换为long是可以的-我检查了值)。

  • 这里有什么问题?我可以像上面那样使用comparisonChain对象(通过创建变量并在某些ifs中添加.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吗?

    最佳答案

    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

    09-11 02:51