2008年10月13日 星期一

How to sort objects in Java: Comparator

以下是實踐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());

沒有留言: