假如你有一個 Integer 對象的列表,並且你想使用 Coolections.sort 來對它們進行排序。另外,你還要自己指定一個比較器,因為你想按降序而不是升序排列它們。這裡有一些代碼示例說明了該怎麼做:
import Java.util.*;
public class LocalDemo1 {
// 使用實現了 Comparator 的匿名類排序。
static void sortanon(List list) {
Collections.sort(list, new Comparator() {
public int compare(
Object o1, Object o2) {
int cc = ((Integer)o1).compareTo(o2);
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
}
});
}
// 使用實現了 Comparator 的局部類排序
static void sortlocal(List list) {
class MyComparator implements Comparator {
public int compare(
Object o1, Object o2) {
int cc = ((Integer)o1).compareTo(o2);
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
}
};
Collections.sort(list, new MyComparator());
}
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add(new Integer(1));
list1.add(new Integer(2));
list1.add(new Integer(3));
sortanon(list1);
System.out.println(list1);
List list2 = new ArrayList();
list2.add(new Integer(1));
list2.add(new Integer(2));
list2.add(new Integer(3));
sortlocal(list2);
System.out.println(list2);
}
}
這段程序的輸出如下:
[3, 2, 1]
[3, 2, 1]
上列中使用兩種不同的方法實現了 Comparator 接口。第一種方法使用匿名類,第二種方法使用局部類,二者有何區別:
一點區別是格式上的——匿名類的定義比較簡捷,它實際上是下面這個表達式的一部分:
Comparator c = new Comparator() {...};
與之相反,局部類的定義看起來非常類似於常規的類定義,略為煩瑣。例如,定義局部類內時可能用到 “implements”語句,而在匿名類中不需要顯示的使用這條語句。
哪一種格式“更好”取決於你自己的觀點。匿名類的定義會比較難讀,但在不需要使用局部類的地方使用局部類會造成一些錯覺,讓人覺得需要做的事比實際要做的事更多。
讓我們來看看另一個例子,更深層的比較匿名類和局部類:
import java.util.*;
public class LocalDemo2 {
// 使用兩個單獨的匿名類實例對兩個列表進行排序
static void sort1(List list1, List list2) {
Collections.sort(list1, new Comparator() {
public int compare(
Object o1, Object o2) {
int cc = ((Integer)o1).compareTo(o2);
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
}
});
Collections.sort(list2, new Comparator() {
public int compare(
Object o1, Object o2) {
int cc = ((Integer)o1).compareTo(o2);
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
}
});
}
// 使用一個局部類的兩個實例來對兩個列表進行排序
static void sort2(List list1, List list2) {
class MyComparator implements Comparator {
public int compare(
Object o1, Object o2) {
int cc = ((Integer)o1).compareTo(o2);
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
}
}
Collections.sort(list1, new MyComparator());
Collections.sort(list2, new MyComparator());
}
// 使用一個匿名類的一個實例來對兩個列表進行排序
static void sort3(List list1, List list2) {
Comparator cmp = new Comparator() {
public int compare(
Object o1, Object o2) {
int cc = ((Integer)o1).compareTo(o2);