为了账号安全,请及时绑定邮箱和手机立即绑定

java - 如何对包含多个异构对象的列表进行排序?

java - 如何对包含多个异构对象的列表进行排序?

至尊宝的传说 2021-12-10 15:28:44
我有一个对象列表,其中包含四个对象(员工、学生、患者、客户)。我需要根据它们对应的 ID 按升序对这些列表进行排序。当我使用Collections.sort(list)方法时给出ClassCastException。以下是我正在使用的完整代码...注意:我也尝试过Comparator接口,但无法定义compare()方法内部的逻辑来对这些对象进行排序。如果列表包含两个对象,那么在内部定义对这些对象进行排序的逻辑很容易,但是如果列表包含两个以上的对象,那么在compare()方法内部定义排序逻辑就非常困难。任何人都可以帮助我如何缩短这份清单吗?请修改以下代码并提供解决方案。输出应按 [10,20,30,40,50,60,70,90] 之类的排序顺序public class Test{    public static void main(String[] args)    {        List list = new ArrayList();        list.add(new Employee(50));        list.add(new Customer(10));        list.add(new Patient(60));        list.add(new Student(90));        list.add(new Employee(20));        list.add(new Customer(40));        list.add(new Patient(70));        list.add(new Student(30));        Collections.sort(list);        System.out.println(list);    }}class Patient implements Comparable<Patient>{    int pId;    Patient(int pId)    {        this.pId = pId;    }    @Override    public int compareTo(Patient o)    {        return this.pId - o.pId;    }    @Override    public String toString()    {        return this.pId + "";    }}class Employee implements Comparable<Employee>{    int empId;    Employee(int empId)    {        this.empId = empId;    }    @Override    public int compareTo(Employee o)    {        return this.empId - o.empId;    }    @Override    public String toString()    {        return this.empId + "";    }}class Customer implements Comparable<Customer>{    int cId;    Customer(int cId)    {        this.cId = cId;    }    @Override    public int compareTo(Customer o)    {        return this.cId - o.cId;    }    @Override    public String toString()    {        return this.cId + "";    }}class Student implements Comparable<Student>{    int sId;    Student(int sId)    {        this.sId = sId;    }    @Override    public int compareTo(Student o)    {        return this.sId - o.sId;    }    @Override    public String toString()    {        return this.sId + "";    }}
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

使用方法定义一个接口Identifiable(或超类 Person)int getId()

使您的所有类都实现该接口(或扩展该超类)。

停止使用原始类型,因此使用 aList<Identifiable>而不是 a List

然后使用 a 对列表进行排序Comparator<Identifiable>,可以使用Comparator.comparingInt(Identifiable::getId).

你所有的类都不应该实现 Comparable。它们的 ID 没有定义它们的自然顺序。在这个特定的用例中,您只是碰巧按 ID 对它们进行排序。因此应该使用特定的比较器。


查看完整回答
反对 回复 2021-12-10
?
慕斯709654

TA贡献1840条经验 获得超5个赞

例如Person,定义一个超类,然后在id那里添加您的。基于 id 逻辑的比较也应该在那里实现。


public class Person implements Comparable<Person> {


    private int id;


    // getters, setters, compareTo, etc


}

让你所有的基类都从 Person


public class Student extends Person { ... }

public class Customer extends Person { ... }

public class Employee extends Person { ... }

public class Patient extends Person { ... }

List用术语定义您Person并对其应用排序。


public static void main(String[] args)

{

    List<Person> list = new ArrayList<>();

    list.add(new Employee(50));

    list.add(new Customer(10));

    list.add(new Patient(60));

    list.add(new Student(90));

    list.add(new Employee(20));

    list.add(new Customer(40));

    list.add(new Patient(70));

    list.add(new Student(30));


    Collections.sort(list);

    System.out.println(list);

}


查看完整回答
反对 回复 2021-12-10
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

创建像 person 这样具有 id 属性的类。然后通过它扩展所有这些类。那么你只需要为 person 类编写比较


查看完整回答
反对 回复 2021-12-10
  • 3 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信