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

Xae*_*ess 3 java comparison guava comparisonchain

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

  1. 按罗马数字排序,然后等于字符串的其余部分
  2. 按字符串的其余部分排序,如果等于罗马数字

我想使用Guava的ComparisonChain但遇到两个问题:

  1. 在Eclipse中调试期间,我无法看到ComparisonChain对象中的内容(即使在ComparisonChain类中).
  2. comparisonChain.result() 在上面的第二个例子中,对于像"XI Something","I​​II Something"等的值,总是返回0(因为问题#1而无法检查流量)(转换为long是正常的 - 我检查了值).

这里有什么问题?我可以使用comparisonChain上面的对象(通过变量和.compare在构建器之类的ifs中添加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();
  }
Run Code Online (Sandbox Code Playgroud)

还有这个:

  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();
Run Code Online (Sandbox Code Playgroud)

给出不同的结果 - 第一种情况是好的,第二种情况总是0.所以问题是:我可以使用ComparisonChain如果显示第二种情况或这种行为是一个错误吗?

JB *_*zet 11

返回a的每个compare方法,不一定是调用compare的链.第一个片段不会忽略结果(因此是正确的),但第二个忽略结果,因此是不正确的.ComparisonChainComparisonChain

如果这样做会是正确的:

comparisionChain = comparisionChain.compare(...).compare(...);
Run Code Online (Sandbox Code Playgroud)

有关源代码,请参阅http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/src-html/com/google/common/collect/ComparisonChain.html#line.89.