Why is my simple comparator broken?

好久不见. 提交于 2019-11-30 17:18:45

Integer overflow… or more precisely, underflow.

Instead, do an explicit comparison:

private static final Comparator<Thing> reverse = new Comparator<Thing>() {
    public int compare(Thing a, Thing b) {
      int av = a.getValue(), bv = b.getValue();
      return (av == bv) ? 0 : ((av < bv) ? -1 : +1);
    }
};

Using subtraction is fine if you are sure that the difference won't "wrap around". For example, when the values in question are constrained to be non-negative.

You cannot use minus to create the comparison. You'll overflow when the absolute difference exceeds Integer.MAX_VALUE.

Instead, use this algorithm:

int compareInts( int x, int y ) {
  if ( x < y ) return -1;
  if ( x > y ) return 1;
  return 0;
}

I like to have this function in a library for such purposes.

try

System.out.println(Integer.MAX_Value - Integer.MIN_VALUE);

This needs to return a positive number as MAX_VALUE > MIN_VALUE but instead prints -1

When comparing Java primitives, it is advisable to convert them to their Object counterparts and rely on their compareTo() methods.

In this case you can do:

return Integer.valueOf(a.getValue()).compareTo(b.getValue())

When in doubt, use a well-tested library.

What kind of numbers do you throw in there? If your numbers are large enough, you could wrap through the MIN/MAX values for integers and end up in a mess.

If a's value is very negative and b's value is very positive your answer will be very wrong.

IIRC, Int overflow silently wraps around in the JVM

-- MarkusQ

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!