为什么这种比较方法违反了其总合同?

时间:2014-09-16 13:10:31

标签: java exception compare

我正在使用一个特殊的比较器根据该对的第二部分对一对对列表进行排序:

Collections.sort(ans, new Comparator<Pair<Component, Double>>()
    {
      public int compare(Pair<Component, Double> l, Pair<Component, Double> r)
      {
        if (r.second - l.second < 0) return  -1;
        else if(r.second==l.second) return 0;
        else return 1;
      }
    });

比较方法似乎都是可传递的(a&lt; b&lt; c =&gt; a&lt; c)和每个组件 等于自己。什么可能导致例外?

1 个答案:

答案 0 :(得分:1)

有一些边缘情况你没有考虑 - 也不应该,因为JDK已经提供了一个完全兼容的方法,我在这里提出完整性::

public static int compare(double d1, double d2) {
    if (d1 < d2)
        return -1;           // Neither val is NaN, thisVal is smaller
    if (d1 > d2)
        return 1;            // Neither val is NaN, thisVal is larger

    // Cannot use doubleToRawLongBits because of possibility of NaNs.
    long thisBits    = Double.doubleToLongBits(d1);
    long anotherBits = Double.doubleToLongBits(d2);

    return (thisBits == anotherBits ?  0 : // Values are equal
            (thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
             1));                          // (0.0, -0.0) or (NaN, !NaN)
}