在自定义创建的比较器

时间:2016-09-26 10:05:24

标签: java collections compare comparator

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。但它给出了我不期望的降序。

有人可以揭开其背后的逻辑神秘面纱

编辑:

  • 交换元素时。是比较返回1?

3 个答案:

答案 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)

请记住:

  • 返回-1将第一个对象放在第二个对象之前(通常值小于0),
  • return 0什么都不做,
  • 返回1将第一个对象放在第二个对象之后(通常值大于0)。

对所有要比较的对象重复此操作,并且您有一个升序排序。在google / youtube上查看bubble sorting算法。

你可以看到:

Collections.reverseOrder(myComparator);

使用与你相反的顺序获得新的比较器。

enter image description here

在这个动画中:

  • a&gt; b - &gt;返回+1(移动权利,b之后)
  • a&lt; b - &gt;返回-1(向左移动,在b之前)