class IntegerComparator implements Comparator<Integer>
{
@Override
public int compare(Integer o1, Integer o2) {
if(o1 < o2)
return 1;
else if(o1 > o2)
return -1;
else
return 0;
}
}
它给出了降序。我知道。我一味地记得。我不明白为什么实现必须是这样的。
我希望结果是升序。因为按升序排列,如果取任何两个相邻元素,则o1应始终小于o2。但它给出了我不期望的降序。
有人可以揭开其背后的逻辑神秘面纱
编辑:
答案 0 :(得分:4)
当第一个参数大于另一个时,结果必须是正数。当第一个参数较小时 - 结果为负数。你的实现给出了降序,因为你正在做的与我刚写的相反。如果您想升序,可以将其乘以-1
。它来自这样一个事实:如果你从第一个数字中减去第二个数字而第一个数字更大 - 结果将是正数。
答案 1 :(得分:1)
比较基于减法。在CPU级别,这就是它的功能。
这是一种优化形式。
long l = (long) o1 - o2; // use a long to avoid overflow.
if (l < 0) return -1;
if (l > 0) return +1;
return 0;
如果o1-o2为负,则返回负数,即o1 <0。 O2
如果o1-o2为正,则返回正数,即o1> 0。 O2
如果o1-o2为零,则返回0,即o1 == o2
答案 2 :(得分:1)
请记住:
对所有要比较的对象重复此操作,并且您有一个升序排序。在google / youtube上查看bubble sorting算法。
你可以看到:
Collections.reverseOrder(myComparator);
使用与你相反的顺序获得新的比较器。
在这个动画中: