compareTo方法如何工作?

时间:2018-01-21 05:54:13

标签: java compareto

Emp类有两个字段int id, int salary实现Comparable<Emp>。这里我只给出了compareTo逻辑:

public int compareTo(Emp e) {
    if(this.salary<e.salary) {
        return 1;
    }
    else
        return -1;
    }
}

主要是我

Emp e1=new Emp(1,200);
Emp e2=new Emp(2,300);
Emp e3=new Emp(3,400);
Emp e4=new Emp(4,50);

ArrayList<Emp> ar=new ArrayList<>();
ar.add(e1);
ar.add(e2);
ar.add(e3);
ar.add(e4);
Collections.sort(ar);
for(Emp e:ar)
    System.out.println(e);

现在我的问题是compareTo()方法是否正常工作? 在方法

list 1(200) is compared with list 2(300) and swapped
list 1(300) is compared with list 2 list 3(400) and swapped

通过这种方式,我得到了400 200 300 50,但我得到了正确的结果,请告诉我它是如何在内部工作的?

2 个答案:

答案 0 :(得分:1)

如果this.salary==e.salary您的方法无法正常运行,请将您的方法更改为此

public int compareTo(Emp e) {
        if(this.salary==e.salary)
            return 0;
        else if(this.salary<e.salary)
            return 1;
        else
            return -1;
}

答案 1 :(得分:0)

您的比较器看起来有问题:

来自java官方文档:

  

int compareTo(T o)

     

<强>参数:   o - 要比较的对象。

     

<强>返回:   负整数,或正整数,因为此对象小于,等于或大于指定对象。

     

<强>抛出:   NullPointerException - 如果指定的对象为null   ClassCastException - 如果指定的对象类型阻止将其与此对象进行比较。

您还应该在比较条件中对象相等的情况下实施,在这种情况下,compareTo(T o)应该返回0

排序代码:

Emp e1=new Emp(1,200);
Emp e2=new Emp(2,300);
Emp e3=new Emp(3,400);
Emp e4=new Emp(4,50);

List<Emp> ar= new ArrayList<Emp>();

ar.add(e1);
ar.add(e2);
ar.add(e3);
ar.add(e4);

Collections.sort(ar, new Comparator<Emp>(){
     @Override
     public int compare(Emp e1, Emp e2)
     {

         return  e1.compareTo(e2);
     }
});

for(Emp e:ar)
    System.out.println(e);

Emp class:

...

public int compareTo(Emp e) {
    //ascending order
    if(this.salary==e.getSalary())
        return 0;
    else if(this.salary<e.getSalary())
        return 1;
    else
        return -1;
}   

<强>输出:

enter image description here