以下是實踐Java排序的一些心得。
可排序的物件(例如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() <>
return -1;
if (file1.getFilesize() = file2.getFilesize())
return 0;
}
}
用法
FileObjectp[] fileObj = new FileObject[10];
Arrays.sort(fileObj, new FilesizeComparator());
沒有留言:
張貼留言