如何使用集合对对象的属性进行排序

美好的一天!

我有一个具有以下属性的对象学生:

class Student String name Date birthday 

我使用arrayList存储学生对象我的问题是,如何使用collecitons排序按生日对StudentList进行排序?

 List  studentList = new ArrayList(); 

我该如何编码呢?

Collections.sort(????);

谢谢

您可以将Comparator传递给Collections.sort()以按生日处理排序:

 Collections.sort(studentList, new Comparator() { public int compare(Student s1, Student s2) { return s1.getBirthday().compareTo(s2.getBirthday()); } }); 

如果您还没有将getBirthday()添加到Student类,则需要添加它。

在Java 8中,您可以使用Lambda表达式和Comparator对列表进行排序。 比较 :

 Collections.sort(studentList, Comparator.comparing(s -> s.getBirthday())); 

或者,您可以使用方法参考:

 Collections.sort(studentList, Comparator.comparing(Student::getBirthday)); 

嗨,这是一个可以帮助您理解的示例

 package de.vogella.algorithms.sort.standardjava; import java.util.Comparator; public class MyIntComparable implements Comparator{ @Override public int compare(Integer o1, Integer o2) { return (o1>o2 ? -1 : (o1==o2 ? 0 : 1)); } } package de.vogella.algorithms.sort.standardjava; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Simple2 { public static void main(String[] args) { List list = new ArrayList(); list.add(5); list.add(4); list.add(3); list.add(7); list.add(2); list.add(1); Collections.sort(list, new MyIntComparable()); for (Integer integer : list) { System.out.println(integer); } } } 

您需要编写自定义比较器。

就像是:

 Collections.sort(studentList, new Comparator() { public int compare(Strudent a, Strudent b) { return a.birthday.compareTo(b.birthday); } }); 

这是java的教程,可以了解更多相关信息。 http://download.oracle.com/javase/tutorial/collections/interfaces/order.html

这可能是一个棘手的面试问题:)

我发现解决类似问题的最佳和可重用方法是实现接口Comparator并根据我的需要创建自定义Comparator,可以重复使用。

我在这里留下一个例子,说明如何根据他们的name属性以及根据他们的性别属性(没有任何词典编码的自然顺序)对Person的ArrayList进行排序。

诀窍是使用我想要排序的自定义属性定义一个枚举类。 将自定义比较器应用于该枚举属性,compareTo()方法根据声明值的自然顺序应用顺序(在此示例中为男性,女性,其他)。

 import java.util.*; public class Person { public enum Gender { male,female, others } String name; int age; Gender gender; public Person(String name, int age, Gender gender) { this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public Gender getGender() { return gender; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + '}'; } public static void printPersons(List personList) { for (int i = 0; i < personList.size(); i++) { System.out.println(personList.get(i).toString()); } } public static void printSortedByAgePersons(List personList) { Collections.sort(personList, Person.COMPARE_BY_NAME); for (int i = 0; i < personList.size(); i++) { System.out.println(personList.get(i).toString()); } } public static void printSortedByGender(List personList) { Collections.sort(personList, Person.COMPARE_BY_GENDER); printPersons(personList); } public static Comparator COMPARE_BY_NAME = new Comparator() { @Override public int compare(Person o1, Person o2) { return o1.getName().compareTo(o2.getName()); } }; public static Comparator COMPARE_BY_GENDER = new Comparator() { @Override public int compare(Person o1, Person o2) { return o1.getGender().compareTo(o2.getGender()); } }; // lets test this : public static void main(String args[]) { Person p1 = new Person("André", 22, Gender.male); Person p2 = new Person("Minder", 19, Gender.others); Person p4 = new Person("Maria", 19, Gender.female); Person p3 = new Person("Pedro", 25, Gender.male); List personList = new ArrayList(); personList.add(p1); personList.add(p2); personList.add(p3); personList.add(p4); System.out.println("original list:"); printPersons(personList); System.out.println("------------------------------------------"); System.out.println("sorted list by name in alphabetical order"); printSortedByAgePersons(personList); System.out.println("------------------------------------------"); System.out.println("sorted list by custom order(gender)"); printSortedByGender(personList); } }