Java 根据学生的教师id对学生列表进行排序

Java 根据学生的教师id对学生列表进行排序,java,sorting,collections,comparator,Java,Sorting,Collections,Comparator,我有一份学生名单,上面有他们联系的老师id。下面是学生豆 public class Student { private Integer Id; private String Name; private Integer teacherId; public Student(Integer empId, String empName, Integer teacherId) { super(); this.empId = empId; this.empN

我有一份学生名单,上面有他们联系的老师id。下面是学生豆

public class Student {
    private Integer Id;
    private String Name;
    private Integer teacherId;

public Student(Integer empId, String empName, Integer teacherId) {
    super();
    this.empId = empId;
    this.empName = empName;
    this.teacherId = teacherId;
}
   // setters getters
}
现在在我的主课上,我有一个学生名单,数据如下

public static void main(String[] args) {
     int teacherId = 6;
    List<Student> list = new ArrayList<Student>();

    list.add(new Student(1002, "Kausik",4));
    list.add(new Student(1004, "Tridibendu",6));
    list.add(new Student(1007, "Ram",8));
    list.add(new Student(1003, "Neeraj",6));
    list.add(new Student(1009, "Manish",8));
    list.add(new Student(1001, "Shyam",1));

    // Sorting collection in ascending order based on teacher id
    Collections.sort(list, new StudentComparator());

}
但我希望输出基于传递的教师id作为参数。意思是如果我传递6作为教师id,那么我的输出应该如下所示:

Id: 1004, Name: Tridibendu, TeacherId: 6
 Id: 1003, Name: Neeraj, TeacherId: 6
 Id: 1001, Name: Shyam, TeacherId: 1
 Id: 1002, Name: Kausik, TeacherId: 4
 Id: 1007, Name: Ram, TeacherId: 8
 Id: 1009, Name: Manish, TeacherId: 8

所以,id为6的老师应该在列表的顶部

您可以强制它为匹配的教师返回负数,然后对其余的教师进行正常排序:

public class StudentComparator implements Comparator<Student> {
    private int contactedTeacher;
    public StudentComparator(int contactedTeacherId) {
        this.contactedTeacher = contactedTeacherId;
    }
    @Override
    public int compare(Student o1, Student o2) {
        if(this.contactedTeacher == o1.teacherId) {
            return -1; //Force negative
        } else if(this.contactedTeacher == o2.teacherId) {
            return 1; //Force positive
        }

        //If neither of the compared students contacted the teacher, compare normally by teacher ID
        return o1.getTeacherId().compareTo(o2.getTeacherId());
    }
}

您可以强制它为匹配的教师返回负数,然后对其余的教师进行正常排序:

public class StudentComparator implements Comparator<Student> {
    private int contactedTeacher;
    public StudentComparator(int contactedTeacherId) {
        this.contactedTeacher = contactedTeacherId;
    }
    @Override
    public int compare(Student o1, Student o2) {
        if(this.contactedTeacher == o1.teacherId) {
            return -1; //Force negative
        } else if(this.contactedTeacher == o2.teacherId) {
            return 1; //Force positive
        }

        //If neither of the compared students contacted the teacher, compare normally by teacher ID
        return o1.getTeacherId().compareTo(o2.getTeacherId());
    }
}

您可以做的是使学生实现可比性。为此,您可以:

public class Student implements Comparable<Student> {

...

    @Override
    public int compareTo(Student s) {
        return this.teacherId.compareTo(s.teacherId);
    }
}
公共班级学生实施可比{
...
@凌驾
公共int比较(学生s){
将此.teacherId.compareTo返回(s.teacherId);
}
}
与您的其他事项相关,您可以实现另一个比较器,它允许您根据给定的教师id将列表分为两部分

public class StudentComparator implements Comparator<Student> {
    private Integer id;

    public StudentComparator(Integer id) {
        this.id = id;
    }

    @Override
    public int compare(Student o1, Student o2) {
        int id1 = o1.getTeacherId(); // Let the unboxing do its job
        int id2 = o2.getTeacherId();
        if (id1 == id2) return 0;
        if (id1 == this.id) return 1;
        if (id2 == this.id) return -1;
        return 0;
    }
}
公共类StudentComparator实现Comparator{
私有整数id;
public StudentComparator(整数id){
this.id=id;
}
@凌驾
公共整数比较(学生o1,学生o2){
int id1=o1.getTeacherId();//让解装箱完成它的工作
int id2=o2.getTeacherId();
if(id1==id2)返回0;
if(id1==this.id)返回1;
if(id2==this.id)返回-1;
返回0;
}
}

因此,每当您想根据一个教师id对列表进行分区时,您可以调用
Collections.sort(studentList,newstudentcomparator(teacherId))
您所能做的就是使
学生
实现
可比性。为此,您可以:

public class Student implements Comparable<Student> {

...

    @Override
    public int compareTo(Student s) {
        return this.teacherId.compareTo(s.teacherId);
    }
}
公共班级学生实施可比{
...
@凌驾
公共int比较(学生s){
将此.teacherId.compareTo返回(s.teacherId);
}
}
与您的其他事项相关,您可以实现另一个比较器,它允许您根据给定的教师id将列表分为两部分

public class StudentComparator implements Comparator<Student> {
    private Integer id;

    public StudentComparator(Integer id) {
        this.id = id;
    }

    @Override
    public int compare(Student o1, Student o2) {
        int id1 = o1.getTeacherId(); // Let the unboxing do its job
        int id2 = o2.getTeacherId();
        if (id1 == id2) return 0;
        if (id1 == this.id) return 1;
        if (id2 == this.id) return -1;
        return 0;
    }
}
公共类StudentComparator实现Comparator{
私有整数id;
public StudentComparator(整数id){
this.id=id;
}
@凌驾
公共整数比较(学生o1,学生o2){
int id1=o1.getTeacherId();//让解装箱完成它的工作
int id2=o2.getTeacherId();
if(id1==id2)返回0;
if(id1==this.id)返回1;
if(id2==this.id)返回-1;
返回0;
}
}

因此,每当您想根据一个教师id对列表进行分区时,可以调用
Collections.sort(studentList,newstudentcomparator(teacherId))

问题出在哪里..代码似乎很好!你所说的
是什么意思?我在比较方法中写了什么?您是否尝试打印列表中的
学生对象
?使用以下代码后,应根据
teacherId
对其进行排序:
Collections.sort(list,new StudentComparator())我的意思是根据作为参数传递的教师id进行排序。如果我说sort by teacher id 6,那么下面应该是输出。联系到教6的学生应该在顶部Id:1001,姓名:Shyam,教师Id:6 Id:1002,姓名:Kausik,教师Id:6 Id:1004,姓名:Tridibendu,教师Id:5 Id:1003,姓名:Neeraj,教师Id:7 Id:1007,姓名:Ram,教师Id:8 Id:1009,姓名:Manish,教师Id:8您如何对其余学生进行排序?或者它们应该是随机的。那么,你的学生与上面的6位老师有联系,其余的从哪里来?下一个应该是5还是7,我们应该做下降,还是不重要?需要更具体一点。另外,到目前为止您尝试了什么?另外,在添加新参数TeacherID时,您不会覆盖
compare
方法。如果假设比较将用于其他通用函数,则这可能会导致问题。如果您手动调用它,它将工作,但仅限于此way@Draken是的,如果我将6作为参数传递给排序,那么教师id 6应该在顶部,其余的按任意顺序传递。是的,下一个是5或7。有什么问题吗?代码似乎很好!你所说的
是什么意思?我在比较方法中写了什么?您是否尝试打印列表中的
学生对象
?使用以下代码后,应根据
teacherId
对其进行排序:
Collections.sort(list,new StudentComparator())我的意思是根据作为参数传递的教师id进行排序。如果我说sort by teacher id 6,那么下面应该是输出。联系到教6的学生应该在顶部Id:1001,姓名:Shyam,教师Id:6 Id:1002,姓名:Kausik,教师Id:6 Id:1004,姓名:Tridibendu,教师Id:5 Id:1003,姓名:Neeraj,教师Id:7 Id:1007,姓名:Ram,教师Id:8 Id:1009,姓名:Manish,教师Id:8您如何对其余学生进行排序?或者它们应该是随机的。那么,你的学生与上面的6位老师有联系,其余的从哪里来?下一个应该是5还是7,我们应该做下降,还是不重要?需要更具体一点。另外,到目前为止您尝试了什么?另外,在添加新参数TeacherID时,您不会覆盖
compare
方法。如果假设比较将用于其他通用函数,则这可能会导致问题。如果您手动调用它,它将工作,但仅限于此way@Draken是的,如果我将6作为参数传递给排序,那么教师id 6应该在顶部,其余的按任意顺序传递。是的,下一个是5或7。如果两个学生都联系老师会发生什么?是的,它仍然可以排序,但我觉得T.Claverie的答案更清楚地说明了比较是如何工作的如果两个学生都联系老师会发生什么?诚然,它仍然可以排序,但我觉得T.Claverie的答案更清楚地说明了比较是如何工作的