不同数据类型下如何结合if条件正确实现Comparable比较方法
问题说明
需要编写实现Comparable<Employee>接口的Employee类,实现存储员工对象的ArrayList排序功能,排序规则如下:
- 第一排序维度:入职工龄,按升序排列
- 第二排序维度:工龄相同时比较员工薪资,同样按升序排列
当前编写compareTo方法时触发不兼容类型编译报错:薪资字段salary为double数据类型,直接对两个double类型数值做差得到的结果是double类型,无法满足方法要求的int类型返回值。
原错误实现代码
public class Employee implements Comparable<Employee> { private String lastName; private String firstName; private int years; private double salary; public Employee(String lastName, String firstName, int years, double salary) { this.lastName=lastName; this.firstName=firstName; this.years=years; this.salary=salary; } public void setLastName(String newlastName) { lastName=newlastName; } public String getLastName() { return lastName; } public void setFirstName(String newfirstName) { firstName=newfirstName; } public String getFirstName() { return firstName; } public void setYears(int newyears) { years=newyears; } public int getYears() { return years; } public void setSalary(double newsalary) { salary=newsalary; } public double getSalary() { return salary; } public String toString() { String s=""+lastName+"-"+firstName+":"+years+":"+salary; return s; } public int compareTo(Employee that) { if(this.years != that.getYears()) { return this.years - that.getYears(); } else { // 此处触发编译报错:double类型差值无法自动转为int返回 return this.salary - that.getSalary(); } } }
修复方案
错误原因
compareTo方法约定返回int类型值:返回负数代表当前对象小于比较对象、0代表两者相等、正数代表当前对象大于比较对象。两个double值做差的结果是double类型,直接返回会触发类型不匹配编译错误。
禁止直接将double差值强转为int返回,这种写法会因为浮点数精度截断导致比较逻辑错误——比如两个薪资差小于1时,强转结果为0,会误判两个员工薪资相等,排序结果出错。
正确写法
int类型的工龄字段可以直接用差值返回比较结果,double类型的薪资比较使用JDK内置的Double.compare()静态方法即可,该方法会严格按照数值大小返回符合compareTo约定的int值,还能正确处理NaN、正负零等特殊边界场景。
修复后的compareTo方法代码如下:
public int compareTo(Employee that) { if(this.years != that.getYears()) { return this.years - that.getYears(); } else { // 调用Double内置的比较方法处理double类型排序 return Double.compare(this.salary, that.getSalary()); } }
如果不想调用内置工具方法,也可以手动写判断逻辑实现薪资比较,效果一致:
public int compareTo(Employee that) { if(this.years != that.getYears()) { return this.years - that.getYears(); } else { if (this.salary > that.getSalary()) { return 1; } else if (this.salary < that.getSalary()) { return -1; } else { return 0; } } }
内容的提问来源于stack exchange,提问作者Brock-ly
相关产品推荐
相关产品推荐

