否定比较链

时间:2014-08-19 01:42:01

标签: java comparison guava

我写了类似

的内容
@Override public int compareTo(Cuboid that) {
    return -ComparisonChain.start()
            .compare(this.d0, that.d0)
            .compare(this.d1, that.d1)
            .compare(this.d2, that.d2)
            .result();
}

为了扭转顺序,我只是否定了结果,但现在我发现文件说错了

  

结束此比较链并返回其结果:具有该值的值   与链中第一个非零比较结果相同的符号,如果是,则为零   每个结果都是零。

所以Integer.MIN_VALUE是允许的返回值,然后否定失败。在源代码中,我可以看到只返回-1,0和+1,但这并不是我想要依赖的东西。

而不是否定我可以交换所有操作数。简单而丑陋,但我很好奇是否有更好的解决方案。

4 个答案:

答案 0 :(得分:1)

我不知道这是否更好(我个人不喜欢涉及浮点运算),但你可以通过Math#signum发送它:

return -Math.signum( .... );

我可能只是交换操作数。

答案 1 :(得分:1)

可能比撤消compare参数更清晰的一个选项是将每对参数与其自然顺序相反进行比较:

.compare(this.d0, that.d0, Ordering.natural().reverse())

答案 2 :(得分:0)

也许这个?

int temp = ComparisonChain.start()
            .compare(this.d0, that.d0)
            .compare(this.d1, that.d1)
            .compare(this.d2, that.d2)
            .result();

return temp == Integer.MIN_VALUE ? Integer.MAX_VALUE : -temp;

答案 3 :(得分:0)

实际上是一个不使用浮点的signum函数,即Integer#signum(int),它比Math.signum的{​​{1}}快约3.5倍,而double。< / p>


出于好奇,最快的解决方案是

return -((x&1) | (x>>1));

但只有约10%。