猿问

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

我有一个对象列表,其中包含四个对象(员工、学生、患者、客户)。我需要根据它们对应的 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 + "";

    }


}



至尊宝的传说
浏览 150回答 3
3回答

慕标琳琳

使用方法定义一个接口Identifiable(或超类 Person)int getId()。使您的所有类都实现该接口(或扩展该超类)。停止使用原始类型,因此使用 aList<Identifiable>而不是 a&nbsp;List。然后使用 a 对列表进行排序Comparator<Identifiable>,可以使用Comparator.comparingInt(Identifiable::getId).你所有的类都不应该实现 Comparable。它们的 ID 没有定义它们的自然顺序。在这个特定的用例中,您只是碰巧按 ID 对它们进行排序。因此应该使用特定的比较器。

慕斯709654

例如Person,定义一个超类,然后在id那里添加您的。基于 id 逻辑的比较也应该在那里实现。public class Person implements Comparable<Person> {&nbsp; &nbsp; private int id;&nbsp; &nbsp; // getters, setters, compareTo, etc}让你所有的基类都从 Personpublic 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){&nbsp; &nbsp; List<Person> list = new ArrayList<>();&nbsp; &nbsp; list.add(new Employee(50));&nbsp; &nbsp; list.add(new Customer(10));&nbsp; &nbsp; list.add(new Patient(60));&nbsp; &nbsp; list.add(new Student(90));&nbsp; &nbsp; list.add(new Employee(20));&nbsp; &nbsp; list.add(new Customer(40));&nbsp; &nbsp; list.add(new Patient(70));&nbsp; &nbsp; list.add(new Student(30));&nbsp; &nbsp; Collections.sort(list);&nbsp; &nbsp; System.out.println(list);}

拉莫斯之舞

创建像 person 这样具有 id 属性的类。然后通过它扩展所有这些类。那么你只需要为 person 类编写比较
随时随地看视频慕课网APP

相关分类

Java
我要回答