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,但我得到了正确的结果,请告诉我它是如何在内部工作的?
答案 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
- 如果指定的对象为nullClassCastException
- 如果指定的对象类型阻止将其与此对象进行比较。
您还应该在比较条件中对象相等的情况下实施,在这种情况下,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;
}
<强>输出:强>