如何按类对ArrayList中的对象进行排序?

时间:2017-03-13 10:25:11

标签: java sorting arraylist

我有一个ArrayList,其中包含两种类型的对象(类Student中的对象和类Teacher中的对象)。

我的问题是如何对其进行排序,以便所有来自Student的对象首先出现,然后所有来自类Teacher的对象出现在它们之后。

例如:Student1,Student2,Student3,Teacher1,Teacher2,Teacher3

这是我的代码:

public ArrayList sortList(){

    ArrayList<Student> students = new  ArrayList<Student>();
    ArrayList<Teacher> teachers = new  ArrayList<Teacher>();
    ArrayList<Person> university = new  ArrayList<Person>();
    for(Person p : list){
        if(p.getClass().getSimpleName().equals("Teacher")){
            teachers.add((Teacher)p);
        };
        if(p.getClass().getSimpleName().equals("Student")){
            students.add((Student)p);
        }
        university.addAll(students);
        university.addAll(teachers);
    }
    return university;
}

6 个答案:

答案 0 :(得分:3)

您可以使用Collections.sort(list,comparator)

在比较器中,您可以比较类名,因为(幸运的是)S在字母表中的T之前:

   List<Object> studentsAndTeachers = // ...
   Collections.sort(studentsAndTeachers, (o1, o2) -> o1.getClass().getName().compareTo(o2.getClass().getName()));

因为你首先应用其他排序标准或扩展比较器以识别它们......

答案 1 :(得分:0)

现在它应该像黄油面包一样工作:

String

答案 2 :(得分:0)

像这样的排序将为你完成工作,虽然一般来说不是一个很好的解决方案。

Collections.sort(classroom, (o1, o2) -> {
    if (o1 instanceof Student && o2 instanceof Teacher) {
        return -1;
    }

    if (o1 instanceof Teacher && o2 instanceof Student) {
        return 1;
    }

    return 0;
});

答案 3 :(得分:0)

这是一个Comparator类,它根据类名对Human个对象进行排序,然后是name属性的值。

    public class Comparator<Human> {
        public int compare(Human h1, Human h2) {
            int res = h1.getClass().getName().compareTo(
                         h2.getClass().getName());
            if (res == 0) {
                res = h1.getName().compareTo(h2.getName());
            }
            return res;
        }
    }

如果您使用Collections.sort(...),则可以将列表排序为所需的顺序。

请注意此实现:

  • 根据名称(如示例所示)和
  • 对具有相同类型的对象进行排序 如果添加更多Human的子类,则
  • 不会中断。

答案 4 :(得分:0)

您可以使用Comparator.comparing

list.sort(Comparator.comparing(Teacher.class::isInstance))

之所以可行,是因为Class.isInstance返回了boolean,它包装在实现Boolean的{​​{1}}中。

答案 5 :(得分:0)

您可以将Comparator.comparinglistName.sort()一起使用,如下所示;

list.sort(Comparator.comparing(o -> o.getClass().getName()));