2011-05-09 214 views
8

美好的一天!如何使用集合對對象的屬性進行排序

我有一個具有以下屬性的對象學生:

class Student 
    String name 
    Date birthday 

我使用ArrayList中存放Student對象 我的問題是,我怎麼可以按使用collecitons排序生日StudentList?

List <Student> studentList = new ArrayList<Student>(); 

我該如何編碼?

Collections.sort(????);

謝謝

回答

17

您可以通過一個ComparatorCollections.sort()的生日處理排序:

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

你如果您還沒有,請將getBirthday()加入您的Student班。

+0

謝謝@ WhiteFang34 !!這正是我期待的!在設置到對象之前,我會浪費大量時間來對屬性進行排序。我不知道如何處理按屬性排序 – 2014-08-22 09:10:42

2

你好,這是一個樣本,可以幫助你瞭解

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

您需要編寫自定義比較器。

是這樣的:從Java

Collections.sort(studentList, new Comparator<Student>() { 

    public int compare(Strudent a, Strudent b) { 
     return a.birthday.compareTo(b.birthday); 
    } 

}); 
4

在Java 8中,您可以使用Lambda expressionsComparator對單行進行排序。 comparing

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

或者您可以使用的方法參考:

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

這可以是一個棘手的面試問題:)

我已經找到了解決類似的最好的和可重複使用的方式問題在於實現接口比較器,並根據需要創建自定義比較器,可以重複使用。

我在這裏留下一個例子,說明如何根據人名屬性以及根據他們的性別屬性(沒有任何字典順序自然順序)對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); 

} 

} 
相關問題