集合sorting(List <T>,Comparator <?super T>)方法示例

可能重复:
使用多个键排列Java对象

我找不到任何使用此方法的示例,所有示例都给出第二个参数“null”。 我听说这种方法用于根据多个标准进行sorting,但没有find任何示例。

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

}

对于这个类,如果我想根据他们的名字和年龄来sorting学生的列表我怎样才能使用方法集合sorting(列表,比较器)

build立在你现有的学生class,这是我通常如何做,特别是如果我需要多个比较。

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

用法:

 List<Student> studentList = new LinkedList<>(); Collections.sort(studentList, Student.Comparators.AGE); 

编辑

自Java 8发布以来,使用lambdas可以大大简化内部Comparators器。 Java 8还为Comparator对象thenComparing引入了一个新方法,这样在嵌套比较器时不需要手动检查每个比较器。 以下是考虑到这些更改的Student.Comparators类的Java 8实现。

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

这可能是最简单的方法 –

 Collections.sort(listOfStudent,new Comparator<Student>(){ public int compare(Student s1,Student s2){ // Write your logic here. }}); 

使用Java 8(lambdaexpression式) –

 listOfStudent.sort((s1, s2) -> s1.age - s2.age); 

你可能想要这样的东西:

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

这首先按名字sorting。 如果缺less一个名字,或者两个学生有相同的名字,他们将按年龄sorting。

要使用集合sorting(List,Comparator),您需要创build一个实现比较器接口的类,并通过比较器接口为其中的compare()

你可以做这样的事情:

 class StudentComparator implements Comparator { public int compare (Student s1 Student s2) { // code to compare 2 students } } 

要做到这一点:

  Collections.sort(List,new StudentComparator())