You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何对存放Staff子类的ArrayList按薪资升序排序

实现方案

你可以通过自定义Comparator比较器对listOfStaffs列表排序,核心逻辑是调用每个员工实例的calculateSalary()方法拿到薪资值,再基于BigDecimal自带的比较能力做升序排列。

方案1:Java 8及以上版本(推荐)

直接调用List自带的sort方法,用lambda表达式实现比较器:

listOfStaffs.sort((s1, s2) -> {
    // 因为Staff子类都实现了ICaculator接口,强转后调用薪资计算方法
    ICaculator c1 = (ICaculator) s1;
    ICaculator c2 = (ICaculator) s2;
    // BigDecimal的compareTo方法天然支持大小比较,返回负数、0、正数对应小于、等于、大于
    return c1.calculateSalary().compareTo(c2.calculateSalary());
});

优化方案(类型更安全)

建议先修改抽象父类Staff,让它直接实现ICaculator接口,定义calculateSalary()为抽象方法,避免强转可能出现的类型转换异常:

public abstract class Staff implements ICaculator {
    // 原有属性、构造方法、get/set都不变
    // 抽象类不需要实现接口方法,由子类Employee、Manager实现即可
}

修改后排序代码可以大幅简化,无需强转:

// 写法1:lambda简化
listOfStaffs.sort((s1, s2) -> s1.calculateSalary().compareTo(s2.calculateSalary()));

// 写法2:方法引用进一步简化
listOfStaffs.sort(Comparator.comparing(ICaculator::calculateSalary));

方案2:Java 7及更早版本

使用Collections.sort方法实现排序:

Collections.sort(listOfStaffs, new Comparator<Staff>() {
    @Override
    public int compare(Staff s1, Staff s2) {
        ICaculator c1 = (ICaculator) s1;
        ICaculator c2 = (ICaculator) s2;
        return c1.calculateSalary().compareTo(c2.calculateSalary());
    }
});

补充说明

你现有代码中calculateSalary()方法使用double计算后转BigDecimal的写法存在精度丢失风险,建议直接使用BigDecimal的API做算术运算,不过该问题不影响当前排序逻辑的正确性。

内容的提问来源于stack exchange,提问作者duong-manh-dung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:39:03