我有实现Comparator<String>
的类,它应该以这样的方式对字符串进行排序,即第一个单词为罗马数字的字符串应该在不以罗马数字开头的字符串之前,并且如果两个字符串都以罗马文字开头,那么应该是两个案例:
我想使用Guava的ComparisonChain但遇到两个问题:
comparisonChain.result()
总是返回0(由于问题#1,我无法检查流量),例如“XI Something”,“III Something”等等(转换为long就可以了 - 我检查值)。这是什么问题?我可以像上面那样使用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
吗?
答案 0 :(得分:11)
compare
的每个ComparisonChain
方法都返回一个ComparisonChain
,它不一定是调用compare的链。第一个片段不会忽略结果(因此是正确的),但第二个片段忽略了结果,因此是不正确的。
如果它确实是正确的:
comparisionChain = comparisionChain.compare(...).compare(...);