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