這可以是一個棘手的面試問題:)
我已經找到了解決類似的最好的和可重複使用的方式問題在於實現接口比較器,並根據需要創建自定義比較器,可以重複使用。
我在這裏留下一個例子,說明如何根據人名屬性以及根據他們的性別屬性(沒有任何字典順序自然順序)對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