集合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())
- 这是Files.lines()中的错误,还是我误解了一些关于并行stream的问题?
- 所有的Java小程序去哪儿了?
- NoClassDefFoundError尝试运行我的jar与java.exe -jar …有什么不对?
- 为什么比较器要实现Serializable?
- 如何禁用JRE上IPv4 IP的IPv6栈使用?
- 如何忽略PKIXpath构build失败:sun.security.provider.certpath.SunCertPathBuilderException?
- JPA和Hibernate – Criteria与JPQL或HQL
- 动态添加组件到一个JDialog
- closures阅读器后,是否需要closuresInputStream?