數值型資料(byte int short long float double)天生可比較大小,可排序,String實作了Comparable介面也可以比較大小與排序,而自訂類別多種多樣,沒有一個共有的可以用作排序的指標,因此需要在自訂類別中手動建立對比的方法,出於這個目的,java提供了兩個介面Comparable與Comparator。
Collections.sort()底層排序依靠的是Arrays.sort(),而Arrays.sort()排序時採用的是冒泡法。
需要對比大小的物件可以實作Comparable接口,實作其中的抽象方法,該抽象方法用來設定比較的方式。以下以範例進行說明:
package com.javase.collections.comparable;public class Student implements Comparable<Student> {private String name;private int score;public Student() {super(); }public Student(String name, int score) {super();this.name = name;this.score = score; }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; } @Overridepublic int compareTo(Student stu) {return this.score - stu.score;// 操作对象减去参数对象,升序排列,反之降序。 } }
在compareTo()方法中,以屬性score為排序指標,採用“this.score-stu.score”,最終結果以升序排列,反之降序。
package com.javase.collections.comparable;import java.util.ArrayList;import java.util.Collections;import java.util.List;import org.junit.Test;public class ComparableTest { @Testpublic void testComparable() { List<Student> stus = new ArrayList<Student>(); Student zhangsan = new Student("zhangsan", 100); Student lisi = new Student("lisi", 90); Student wanger = new Student("wanger", 95); stus.add(zhangsan); stus.add(lisi); stus.add(wanger); System.out.println("排序前");for (Student x : stus) { System.out.println(x.getName() + "::" + x.getScore()); } System.out.println("排序后"); Collections.sort(stus);for (Student x : stus) { System.out.println(x.getName() + "::" + x.getScore()); } } }
#輸出:
如果一個類別在建立時未實作Comparable接口,希望在不修改源碼的情況下對其對象進行排序,可以在呼叫排序方法時實作Comparator比較器接口,指定排序方法。以下以範例進行說明:
package com.javase.collections.comparator;public class Student {private String name;private int score;public Student() {super(); }public Student(String name, int score) {super();this.name = name;this.score = score; }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; } }
package com.javase.collections.comparator;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;import org.junit.Test;public class ComparatorTest { @Testpublic void test() { List<Student> stus = new ArrayList<Student>(); Student zhangsan = new Student("zhangsan", 100); Student lisi = new Student("lisi", 90); Student wanger = new Student("wanger", 95); stus.add(zhangsan); stus.add(lisi); stus.add(wanger); System.out.println("排序前");for (Student x : stus) { System.out.println(x.getName() + "::" + x.getScore()); } System.out.println("-----------------------"); Collections.sort(stus, new Comparator<Student>() { @Overridepublic int compare(Student stu01, Student stu02) {// return stu01.getScore() - stu02.getScore();//升序return stu02.getScore() - stu01.getScore();// 降序 } }); System.out.println("排序后");for (Student x : stus) { System.out.println(x.getName() + "::" + x.getScore()); } } }
在compare(Student stu01, Student stu02)方法中,以屬性score為排序指標,採用“stu01.score-stu02.score”,最終結果升序排列,反之降序。
輸出:
以上是Comparable與Comparator的比較與使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!