2016-05-26 2 views
0

У меня есть список учеников с указанием их учителя, с которым они связались. ниже - студенческий боб.Сортировать список учеников на основе их учителя 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 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 

, но я хочу, выход на основе прошедшего учителя ид как parameter.Mean, если я прохожу 6 в качестве учителя ид тогда мой вывод должен быть ниже:

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 

так учитель имеет идентификатор в 6 должен быть вверху списка.

+0

что проблема ..следующего коду кажется нормально! Что вы подразумеваете под 'что я пишу в методе сравнения? Пробовал ли вы печатать «Студенческий объект» в своем списке? Они должны быть отсортированы на основе 'teacherId' после использования следующего кода: ' Collections.sort (list, new StudentComparator()); ' – Abhishek

+0

Я имею в виду сортировку на основе идентификатора учителя, переданного как параметр. Если я скажу, что сортировка по id учителя 6, то ниже должна быть выведена. студенты контактировали научить 6 должны быть на вершине Id: 1001 Имя: Shyam, TeacherId: 6 Id: 1002, Имя: Каусик, TeacherId: 6 Id: 1004, Имя: Tridibendu, TeacherId: 5 Id: 1003, Имя: Neeraj, TeacherId: 7 Id: 1007, Имя: Ram, TeacherId: 8 Id: 1009, Имя: Manish, TeacherId: 8 –

+0

Как вы относите остальных к ученикам? Или они должны быть случайными. Итак, у вас есть ученики, связанные с TeacherID 6, сверху, где остальные? Должны ли 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

Что произойдет, если оба ученика свяжутся с Учителем? Правда, все равно все будет хорошо, но я чувствую, что ответ Т. Клавери немного более ясен о том, как работает сравнение – Draken

2

Что вы можете сделать, это Student реализовать Comparable<Student>. Для этого, вы можете сделать:

public class Student implements Comparable<Student> { 

... 

    @Override 
    public int compareTo(Student s) { 
     return this.teacherId.compareTo(s.teacherId); 
    } 
} 

, относящийся к вашему другому вопросу, вы можете просто реализовать еще один компаратор, который позволит вам разделить ваш список на две части, на основании данного удостоверения учителя.

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

Таким образом, всякий раз, когда вы хотите, чтобы разбить список на основе одного учителя идентификатора, вы можете позвонить Collections.sort(studentList, new StudentComparator(teacherId))