List
後,還需要依物件的某個屬性來做排序。如下面的
theStudents
變數裡面放了一堆Student
類別的物件,還要依每個學生的分數來做降冪排列:
Student student1 = new Student(1, "Mark", 90); Student student2 = new Student(2, "Tom", 58); Student student3 = new Student(3, "Shine", 70); Student student4 = new Student(4, "Kelly", 88); Student student5 = new Student(5, "Mark", 60); List<Student> theStudents = Arrays.asList(student1, student2, student3, student4, student5);要達到上列的要求,我可以用
java.util.Collections
類別中的sort(java.util.List)
這個方法來實現,但在Java Doc中有提到,傳入該方法的List
物件,其中包含的元件需要支援排序,在實作上要讓其中的元素實作Comparable介面。回到我的例子,若要讓
Student
類別可以依分收排序,就要讓Student
類別實作Comparable介面,並在compareTo中去實作分數比較的邏輯:
package idv.jk.model; public class Student implements Comparable<Student> { public Student(int id, String name, int score) { super(); this.id = id; this.name = name; this.score = score; } private int id; private String name; private int score; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", score=" + score + "]"; } @Override public int compareTo(Student student) { return this.getScore() <= student.getScore() ? 1 : -1; } }在
public int compareTo(Student student)
回傳「1」可以想成此物件和其他Student
物件比較時,若分數比較小,會往後排;若是回傳「-1」,即分數比較大,則會往前排,達到我要依分數做降冪排列的需求。
依不一樣的需求,可以依所需要的邏輯去實作,詳細的說明可以參考compareTo。
再來我就可以寫個程式來驗證我的實作:
package idv.jk.test; import java.util.Arrays; import java.util.Collections; import java.util.List; import idv.jk.model.Student; public class SortStudentMain { public static void main(String args[]) { Student student1 = new Student(1, "Mark", 90); Student student2 = new Student(2, "Tom", 58); Student student3 = new Student(3, "Shine", 70); Student student4 = new Student(4, "Kelly", 88); Student student5 = new Student(5, "Mark", 60); List<Student> theStudents = Arrays.asList(student1, student2, student3, student4, student5); System.out.println("排序前:"); for(Student s : theStudents) { System.out.println(s); } Collections.sort(theStudents); System.out.println("排序後:"); for(Student s : theStudents) { System.out.println(s); } } }執行列出排序前和排序後的結果為:
排序前: Student [id=1, name=Mark, score=90] Student [id=2, name=Tom, score=58] Student [id=3, name=Shine, score=70] Student [id=4, name=Kelly, score=88] Student [id=5, name=Mark, score=60] 排序後: Student [id=1, name=Mark, score=90] Student [id=4, name=Kelly, score=88] Student [id=3, name=Shine, score=70] Student [id=5, name=Mark, score=60] Student [id=2, name=Tom, score=58]
沒有留言:
張貼留言