【问题标题】:Sort Student list based on their teacher id根据教师 ID 对学生列表进行排序
【发布时间】:2016-05-26 06:53:33
【问题描述】:

我有一份学生名单,上面有他们联系的老师 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());

}

下面是我的学生比较类。谁能帮我在比较方法中写什么,以便如果我将 2 作为教师 id 传递,列表应该按这样一种方式排序,即所有与教师 id 2 联系的学生都应该在顶部,其余的必须在底部.

或者有没有其他方法可以在java中做到这一点?

public class StudentComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {        
        return o1.getTeacherId().compareTo(o2.getTeacherId());
    }
}

下面是我得到的输出。

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

但我希望输出基于传递的教师 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 应该在列表的顶部。

【问题讨论】:

  • 有什么问题..代码看起来不错! what do i write in my compare method 是什么意思?您是否尝试在列表中打印Student object?使用以下代码后,应根据teacherId 对它们进行排序:Collections.sort(list, new StudentComparator());
  • 我的意思是根据作为参数传递的教师 ID 进行排序。如果我说按教师 ID 6 排序,则应输出以下内容。联系教学 6 的学生应在顶部 ID:1001,姓名:Shyam,TeacherId:6 Id:1002,姓名:Kausik,TeacherId:6 Id:1004,姓名:Tridibendu,TeacherId:5 Id:1003,姓名:Neeraj, TeacherId:7 Id:1007,姓名:Ram,TeacherId:8 Id:1009,姓名:Manish,TeacherId:8
  • 你会如何对其余的学生进行排序?或者它们应该是随机的。所以你有学生连接到顶部 6 的 TeacherID,其余的从哪里来?接下来应该是 5 还是 7,我们应该降序,还是无关紧要?需要更具体一点。另外,到目前为止,您尝试过什么?
  • 另外,您不会在添加新参数 TeacherID 时覆盖 compare 方法。如果您假设比较将在其他通用函数中使用,这可能会导致问题。如果你手动调用它,它会起作用,但只能以这种方式
  • @Draken 是的,如果我将 6 作为参数传递给排序,那么教师 id 6 应该排在最前面,其余的按任何顺序排列。是的,接下来是 5 或 7。

标签: java sorting collections comparator


【解决方案1】:

你可以做的是让Student实现Comparable&lt;Student&gt;。为此,您可以这样做:

public class Student implements Comparable<Student> {

...

    @Override
    public int compareTo(Student s) {
        return this.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;
    }
}

因此,无论何时您想根据一个教师 ID 对列表进行分区,您都可以致电 Collections.sort(studentList, new StudentComparator(teacherId))

【讨论】:

    【解决方案2】:

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

    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());
        }
    }
    

    那么你的排序调用变成:

    Collections.sort(list, new StudentComparator(teacherId));
    

    【讨论】:

    • 如果两个学生都联系老师会怎样?诚然,它仍然会很好,但我觉得 T. Claverie 的回答更清楚地说明了比较的工作原理
    猜你喜欢
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2011-12-15
    • 2021-02-03
    • 2015-01-08
    • 2016-08-06
    • 1970-01-01
    相关资源
    最近更新 更多