我刚刚开始使用google的Guava集合(ComparisonChain和Objects).在我的pojo我覆盖了equals方法,所以我先做了这个:
return ComparisonChain.start()
.compare(this.id, other.id)
.result() == 0;
Run Code Online (Sandbox Code Playgroud)
但是,我意识到我也可以使用它:
return Objects.equal(this.id, other.id);
Run Code Online (Sandbox Code Playgroud)
我没有看到比较链何时更好,因为你可以轻松添加更多条件,如下所示:
return Objects.equal(this.name, other.name)
&& Objects.equal(this.number, other.number);
Run Code Online (Sandbox Code Playgroud)
如果您特别需要返回int,我可以看到的唯一好处.它有两个额外的方法调用(开始和结果),并且对于菜鸟来说更复杂.
我错过了ComparisonChain有明显的好处吗?
(是的,我也用适当的覆盖哈希码Objects.hashcode())
我有一个包含多个字段的ComplexObject,我想这样说:
x两者都存在字段,则转到compare比较链中的下一个字段.compare比较链中的下一个. 我不知道该怎么做,因为据我所知
.compare(c1.getX(), c2.getX(), Ordering.arbitrary().nullsLast())
Run Code Online (Sandbox Code Playgroud)
将
有没有办法可以用番石榴ComparisonChain或Ordering类来实现我想要的?或者有更好的方法来考虑解决这个问题吗?
我有类实现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如果显示第二种情况或这种行为是一个错误吗?
番石榴的比较链是不应该懒惰地评价比较?在下面的代码中NullComparator(阿帕奇)将返回一个非零值,如果不链终止?
从文档:ComparisonChain实现停止调用其输入'compareTo并比较方法一旦其中一个返回非零结果
String x = null;
String y = "y";
ComparisonChain.start().compare(x,y, new NullComparator(false)).
compare(x.getBytes().toString(), y.getBytes().toString()).result();
Run Code Online (Sandbox Code Playgroud)
注意:上面只是一个例子.也许这将是更好的例子
ComparisonChain.start().compare(x,y, new NullComparator(false)).
compare(x.getBytes(), y.getBytes(), UnsignedBytes.lexicographicalComparator()).result();
Run Code Online (Sandbox Code Playgroud)