如何使用集合对对象的属性进行排序
问题描述:
美好的一天!如何使用集合对对象的属性进行排序
我有一个具有以下属性的对象学生:
class Student
String name
Date birthday
我使用ArrayList中存放Student对象 我的问题是,我怎么可以按使用collecitons排序生日StudentList?
List <Student> studentList = new ArrayList<Student>();
我该如何编码?
Collections.sort(????);
谢谢
答
您可以通过一个Comparator
到Collections.sort()
的生日处理排序:
Collections.sort(studentList, new Comparator<Student>() {
public int compare(Student s1, Student s2) {
return s1.getBirthday().compareTo(s2.getBirthday());
}
});
你如果您还没有,请将getBirthday()
加入您的Student
班。
答
你好,这是一个样本,可以帮助你了解
package de.vogella.algorithms.sort.standardjava;
import java.util.Comparator;
public class MyIntComparable implements Comparator<Integer>{
@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<Integer> list = new ArrayList<Integer>();
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);
}
}
}
答
您需要编写自定义比较器。
是这样的:从Java
Collections.sort(studentList, new Comparator<Student>() {
public int compare(Strudent a, Strudent b) {
return a.birthday.compareTo(b.birthday);
}
});
答
在Java 8中,您可以使用Lambda expressions和Comparator对单行进行排序。 comparing:
Collections.sort(studentList, Comparator.comparing(s -> s.getBirthday()));
或者您可以使用的方法参考:
Collections.sort(studentList, Comparator.comparing(Student::getBirthday));
答
这可以是一个棘手的面试问题:)
我已经找到了解决类似的最好的和可重复使用的方式问题在于实现接口比较器,并根据需要创建自定义比较器,可以重复使用。
我在这里留下一个例子,说明如何根据人名属性以及根据他们的性别属性(没有任何字典顺序自然顺序)对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<Person> personList) {
for (int i = 0; i < personList.size(); i++) {
System.out.println(personList.get(i).toString());
}
}
public static void printSortedByAgePersons(List<Person> 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<Person> personList) {
Collections.sort(personList, Person.COMPARE_BY_GENDER);
printPersons(personList);
}
public static Comparator<Person> COMPARE_BY_NAME = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
};
public static Comparator<Person> COMPARE_BY_GENDER = new Comparator<Person>() {
@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<Person> personList = new ArrayList<Person>();
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);
}
}
谢谢@ WhiteFang34 !!这正是我期待的!在设置到对象之前,我会浪费大量时间来对属性进行排序。我不知道如何处理按属性排序 – 2014-08-22 09:10:42