标签: comparisonchain

使用ComparisonChain而不是Objects.qual()&& Objects.equal()...和Guava有什么好处

我刚刚开始使用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())

java equals guava comparisonchain

12
推荐指数
2
解决办法
1万
查看次数

我可以使用Guava的ComparisonChain以特殊方式处理空字段吗?

我有一个包含多个字段的ComplexObject,我想这样说:

  • 如果x两者都存在字段,则转到compare比较链中的下一个字段.
  • 如果两者都为null,则转到compare比较链中的下一个.
  • 如果一个为空而另一个不为,则将空值放在最后

我不知道该怎么做,因为据我所知

.compare(c1.getX(), c2.getX(), Ordering.arbitrary().nullsLast())
Run Code Online (Sandbox Code Playgroud)

将

  1. 如果它们都存在且相等,则认为对象是相等的
  2. 如果它们都是null,则认为对象是相等的.

有没有办法可以用番石榴ComparisonChain或Ordering类来实现我想要的?或者有更好的方法来考虑解决这个问题吗?

java comparator guava comparisonchain

6
推荐指数
1
解决办法
3488
查看次数

使用Guava的ComparisonChain比较包含罗马数字的字符串

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

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

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

  1. 在Eclipse中调试期间,我无法看到ComparisonChain对象中的内容(即使在ComparisonChain类中).
  2. comparisonChain.result() 在上面的第二个例子中,对于像"XI Something","I​​II 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如果显示第二种情况或这种行为是一个错误吗?

java comparison guava comparisonchain

3
推荐指数
1
解决办法
4068
查看次数

番石榴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)

java guava comparisonchain

2
推荐指数
1
解决办法
640
查看次数

标签 统计

comparisonchain ×4

guava ×4

java ×4

comparator ×1

comparison ×1

equals ×1