可排序的物件(例如Bean)需實作java.lang.Comparable interface,這個interface僅包含了單一方法 - compareTo,compareTo定義了該物件與其他同類型物件該如何排序的規則
compareTo的規則是:透過回傳值int來表示排序的大小,回傳值為負數表示本身物件要排序的屬性,比被比較的物件的該屬性,在邏輯上的地位較小,若為正則相反。回傳值若為0則表示兩物件相等
某些物件本身已經實作了compareTo這個method,像是String、File、Date和Time等物件
若 要排序多個屬性,可建立一個物件實作java.util.Comparator介面,Comparator僅包含compare一個方法,參數型態是 Object。方法內定義了兩個相同物件該如何排序的規則。實作時要經過轉型(有可能造成ClassCastException)。回傳值型態一樣為 int,若回傳值為正數,則obj1的排序在obj2之後,若回傳值為負數,則obj1的排序在obj2之前,若回傳值為0,則兩者相等。規則同 compareTo
同類型物件才能被排序(也才有意義)
實際執行排序的方法包括Arrays.sort和Collnections.sort,兩者都是static method,將該物件陣列及實作Comparator介面的物件傳入後,即可排序(不用回傳值)
==
方法1
public class FileObject implements java.lang.Comparable {
private String filename;
private Long filesize;
public FileObject() { }
public String getFilename() {
return this.filename;
}
public Long getFilesize() {
return this.filesize;
}
public void setFilename(String name) {
this.filename = name;
}
public void setFilesize(Long size) {
this.filesize = size;
}
public int compareTo(Object obj) throws ClassCastException {
if (!(obj instanceof Example1))
throws new ClassCastException("Error msg here.");
// 先做轉型
FileObject fileobj = (FileObject) obj;
// 使用String內建的規則
return this.filename.compareTo(fileobj.getFilename());
}
}
用法
FileObject[] fileObj = new FileObject[10];
Arrays.sort(fileObj);
方法2 – 實作java.util.Comparator的方式
public class FilesizeComparator implements Comparator {
public int compare(Object obj1, Object obj2) {
File file1 = (File) obj1;
File file2 = (File) obj2;
// 這裡放置要比較的邏輯,不過回傳值要是int,要注意int溢位的問題
if (file1.getFilesize() > file2.getFilesize())
return 1;
if (file1.getFilesize() < file2.getFilesize())
return -1;
if (file1.getFilesize() = file2.getFilesize())
return 0;
}
}
用法
FileObjectp[] fileObj = new FileObject[10];
Arrays.sort(fileObj, new FilesizeComparator());
您好,在搜尋關於Comparable時看到您的文章,可以請教您一個問題嗎?覆寫完compareTo(),以x和y做比較x.compareTo(y)回傳是-1時,也就是y比x大,那JVM就會把y排序到x前面,它們內部運作道理是這樣嗎?@@ 不好意思,打擾您哩,請前輩指教^^
抱歉晚回覆.... 您所謂的"內部運作道理"是指JVM內部本身如何對物件排序嗎?其實JVM本身並不知道物件的排序規則為何,物件的排序規則需要您自己去定義的(所以才要實作compareTo()阿....)。 很久沒寫java了,以上是我的理解(若有錯請提出....Orz),希望對你有幫助 :D
您好,先謝謝您撥空幫小弟解答疑惑~那意思是說JVM是由回傳值來判斷該物件是排前還是排後嗎? 假設如果是回傳負數,JVM就會把this物件排在被比較物件之前 是這樣嗎? 不好意思打擾嘍^^
簡要說明 讀入下示檔案,建構Circle物件及Square物件, 將所有Circle物件依半徑大小排序,並算其總面積和. 將所有Square物件依邊長大小排序,並算其總面積和. ---------------shape.txt 圓形 5.0 正方形 7.0 圓形 2.5 正方形 1.0 圓形 3.5 正方形 7.5 正方形 1.5 圓形 2.3 正方形 9.2 正方形 11.0 圓形 1.25 正方形 4.35 正方形 5.6 圓形 7.8 這可以用JAVA幫我寫出來嗎?? 拜託囉 急需
不行
ㄚ琪年紀大了,兩個介面使用不同的方法,有辦法可以容易的記起來嗎?