我有一个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;
}
答案 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.comparing
与listName.sort()
一起使用,如下所示;
list.sort(Comparator.comparing(o -> o.getClass().getName()));