3

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

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

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

  1. 在 Eclipse 中调试期间,我看不到比较链对象内部的内容(即使在比较链类中)。
  2. comparisonChain.result()在上面的第二个示例中,对于“XI Something”、“III Something”等值,始终返回 0(由于问题 #1,我无法检查流程)(转换为 long 是可以的 - 我检查了值)。

这里有什么问题?我可以使用comparisonChain像上面这样的对象(通过创建变量并.compare在一些 if 中添加 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所示的,还是这种行为是一个错误?

4

1 回答 1

11

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

于 2011-12-12T22:17:15.043 回答