Xae*_*ess 3 java comparison guava comparisonchain
我有类实现Comparator<String>,它应该以这样的方式对字符串进行排序,即第一个单词为罗马数字的字符串应该在不以罗马数字开头的字符串之前,如果两个字符串都以罗马文字开头,则应该有两种情况:
我想使用Guava的ComparisonChain但遇到两个问题:
comparisonChain.result() 在上面的第二个例子中,对于像"XI Something","III 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)
| 归档时间: |
|
| 查看次数: |
4068 次 |
| 最近记录: |