我第一次看到这里的时候,就有一种高大上的感觉,虽然很短,两位小伙伴Gizing and Hammer看完之后和我交流。
当一个类是final类时,我们如何创建一个新的类?当我们要用函数findMax找出最大的矩形时,答案依赖于最大的边长或者是最大的面积?当我们用compareTo()比较字符串的长度时,由于该函数不区分大小写,“HBHI”按照字典排序,排在了“adaf”的前面,这显然不是我们想要的结果。
这一系列的问题的解决方案是重写函数,使得其接受两个参数:一个是对象的数组,另外一个是决定方式的函数。将函数作为参数的方法:我们可以将函数包含在一个只有函数的类中,并传递该类的一个实例。事实上,一个函数通过将其放在一个对象内部而被传递,这样的现象叫做函数对象。
//Generic findMax,with function object,
//Precondition:a.size()>0
Public static <AnyType> AnyType findMax(AnyType[] arr, Comparator<? Super AnyType> cmp){
Int maxIndex = 0;
For(int i = 1; i < arr.size(); i++)
If(cmp.compare(arr[i] , arr[maxIndex]) > 0)
maxIndex = i;
return arr[maxIndex];
}
Class CaseInsensitiveCompare implements Comparator<String>{
Public int compare(String lhs, String rhs){
Return lhs.compareToIgnoreCase(rhs);
}
}
Class TestProgram{
Public static void main(String[] args){
String[] arr = {“ZEBRA”, “alligator”, “crocodie”};
System.out.println(findMax(arr,new CaseInsensitiveCompare()));
}
}
//定义的Comparator接口
Package java.util;
Public interface Comparator<AnyType>{
Int compare(AnyType lhs, AnyType rhs);
}
这是数据结构与算法分析Java版中的分析过程,感觉很高大上,以后编代码的过程中,能把语法用到这个地步,同时能从编译器的角度来解释程序,个人觉得能力就是另外一个层面的了。