可排序的物件(例如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());
Recommend to Front page



假設如果是回傳負數,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幫我寫出來嗎??
拜託囉
急需
Comment Permissions: Allow commenting