Possible Duplicate:
Sorting Java objects using multiple keys
I can't find any example of using this method, all examples give the second parameter "null". I heard that this method used for sorting classes according to more than one criterion but no example where found.
public class Student implements Comparable<Student> {
String name;
int age;
public Student(String name, int age) { this.name = name; this.age = age;
}
@Override
public String toString() { return name + ":" + age;
}
@Override
public int compareTo(Student o) { Integer myAge = age; Integer oAge = o.age; return myAge.compareTo(oAge);
}}
for this class if i want to sort a list of Student according to their names & ages how can i use the method Collections sort(List,Comparator)
04 Answers
Building upon your existing Student class, this is how I usually do it, especially if I need more than one comparator.
public class Student implements Comparable<Student> { String name; int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return name + ":" + age; } @Override public int compareTo(Student o) { return Comparators.NAME.compare(this, o); } public static class Comparators { public static Comparator<Student> NAME = new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.name.compareTo(o2.name); } }; public static Comparator<Student> AGE = new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.age - o2.age; } }; public static Comparator<Student> NAMEANDAGE = new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { int i = o1.name.compareTo(o2.name); if (i == 0) { i = o1.age - o2.age; } return i; } }; }
}Usage:
List<Student> studentList = new LinkedList<>();
Collections.sort(studentList, Student.Comparators.AGE);EDIT
Since the release of Java 8 the inner class Comparators may be greatly simplified using lambdas. Java 8 also introduces a new method for the Comparator object thenComparing, which removes the need for doing manual checking of each comparator when nesting them. Below is the Java 8 implementation of the Student.Comparators class with these changes taken into account.
public static class Comparators { public static final Comparator<Student> NAME = (Student o1, Student o2) -> o1.name.compareTo(o2.name); public static final Comparator<Student> AGE = (Student o1, Student o2) -> Integer.compare(o1.age, o2.age); public static final Comparator<Student> NAMEANDAGE = (Student o1, Student o2) -> NAME.thenComparing(AGE).compare(o1, o2);
} 1 This might be simplest way -
Collections.sort(listOfStudent,new Comparator<Student>(){ public int compare(Student s1,Student s2){ // Write your logic here. }});Using Java 8(lambda expression) -
listOfStudent.sort((s1, s2) -> s1.age - s2.age); 4 You probably want something like this:
Collections.sort(students, new Comparator<Student>() { public int compare(Student s1, Student s2) { if(s1.getName() != null && s2.getName() != null && s1.getName().comareTo(s1.getName()) != 0) { return s1.getName().compareTo(s2.getName()); } else { return s1.getAge().compareTo(s2.getAge()); } }
);This sorts the students first by name. If a name is missing, or two students have the same name, they are sorted by their age.
1To use Collections sort(List,Comparator) , you need to create a class that implements Comparator Interface, and code for the compare() in it, through Comparator Interface
You can do something like this:
class StudentComparator implements Comparator
{ public int compare (Student s1 Student s2) { // code to compare 2 students }
}To sort do this:
Collections.sort(List,new StudentComparator()) 0