如何使用compareTo方法按指定公式对Java自定义对象排序
问题修正方案
你当前的排序逻辑错误点在于compareTo方法仅对比了weight属性,没有按照指定加权公式计算综合评分后再对比,只需要修改compareTo的实现逻辑即可。
排序规则说明
指定排序的加权公式为:
综合得分 = (身高 + 体重) * 30% + 分数 * 40%
排序时对比两个学生对象的综合得分即可,默认Arrays.sort为升序排列(得分从低到高),需要降序可以调整返回值的对比顺序。
修改后的compareTo实现
直接替换原Student类中的compareTo方法即可,注意提前确认类中存在getHeight()、getScore()对应的getter方法:
@Override public int compareTo(Student o) { // 计算当前实例的综合得分 float currentTotal = (this.getHeight() + this.getWeight()) * 0.3f + this.getScore() * 0.4f; // 计算待对比实例的综合得分 float compareTotal = (o.getHeight() + o.getWeight()) * 0.3f + o.getScore() * 0.4f; // 用Float.compare处理浮点数对比,避免精度转换导致的排序错误 return Float.compare(currentTotal, compareTotal); }
可选调整
- 如果需要按综合得分从高到低降序排列,将return语句修改为
return Float.compare(compareTotal, currentTotal); - 如果权重比例需要调整,直接修改公式中对应的乘算系数即可
运行结果参考
按升序排序后的输出顺序为:
- zhouqi:综合得分112.0
- zhengba:综合得分113.5
- lisi:综合得分116.4
- wangwu:综合得分119.2
- zhangsan:综合得分122.0
- zhaoliu:综合得分123.9
内容的提问来源于stack exchange,提问作者Broke Samith
相关产品推荐
相关产品推荐

