2016-05-26 61 views
0

我有一个学生的列表,他们的教师编号与他们联系过。下面是学生豆。根据他们的教师编号排序学生列表

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作为教师编号,则列表应按照与教师编号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作为parameter.Mean输出,如果我通过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应该是列表顶部。

+0

是什么..The代码似乎罚款的问题! 你的意思是“我在比较方法中写什么”? 您是否尝试在列表中打印“学生对象”?在使用下面的代码之后,这些应该根据'teacherId'排序: 'Collections.sort(list,new StudentComparator());' – Abhishek

+0

我的意思是根据作为参数传递的教师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,Name:Ram,TeacherId:8 Id:1009,Name:Manish,TeacherId:8 –

+0

你会如何分类其余的学生?或者他们应该是随机的。所以你有一些与上面6位TeacherID相关的学生,其余的来自哪里?如果下一个5或7,我们应该降序,还是不重要?需要更具体些。另外,你到目前为止尝试过什么? – Draken

回答

1

你可以迫使它为休息返回阴性匹配的老师,然后正常排序:

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)); 
+0

如果两个学生都联系老师,会发生什么情况?诚然,它仍然可以很好地排序,但我觉得T. Claverie的答案在比较的工作方式上更清晰一些 – Draken

2

你可以做的是让Student实现Comparable<Student>。对于这一点,你可以这样做:

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))