标题: 发布一篇经由过程Java泛型完成数组排序和搜刮的通用办法 [打印本页] 作者: 兰色精灵 时间: 2015-1-18 11:19 标题: 发布一篇经由过程Java泛型完成数组排序和搜刮的通用办法 市场分额,java比asp高一点,因为C#是仿照java开发的,所以哦C#能做的java都能做到,但是java能做的,C#不一定都能做到。毕竟是抄袭吗。
上面会商的是数组的排序和搜刮功效,而一个通用办法则是完成Comparable接口的办法,这个办法必要经由过程java泛型来完成。上面便慢慢解说为什么,和怎样经由过程Java泛型完成此类的通用办法。
怎样在java类中一些通用办法,出格是一些静态的工具办法?
好比,数组Arrays的sort、search等?
1.整数数组的按次压缩
public static int seqSearch(int[] arr, int first, int last, int target) {
for (int i = first; i < last; i++)
if (arr[i] == target)
return i;
return -1;
}
1.1对下面的办法举行笼统,开始让我们想到就是,利用java的Object的援用,来完成通用办法
public static int seqSearch(Object[] arr, int first, int last, Object target) {
for (int i = first; i < last; i++)
if (arr[i].equals(target))
return i;
return -1;
}
2.1如许看来仿佛Object的援用仿佛十分便利,并且第二个按次搜刮可使用到float,double,String等等。假如我们要进一步研讨就会呈现成绩
public static void selectionSort(int[] arr) {
int n = arr.length, smallIndex = 0;
for (int i = 0; i < n; i++) { // 遍历array数组
smallIndex = i;
for (int j = i + 1; j < n; j++)
if (arr[smallIndex] > arr[j]) // 选择最小的索引j
smallIndex = j;
// if (smallIndex != i) {
exchange(arr, i, smallIndex);// 互换array[i]与 min(array[i+1,..,n])
// }
}
}
2.2下面的代码是一个按次排序的算法,若果我们要写一个通用办法,就必需把object范例强迫装换为一个完成Comparable接口的办法。
JVM在处置范例强迫装换的时分就会,抛出一个告诫:uncheckcast
@SuppressWarnings("unchecked")
public static void selectionSort(Object[] arr) {
int n = arr.length, smallIndex = 0;
for (int i = 0; i < n; i++) { // 遍历array数组
smallIndex = i;
for (int j = i + 1; j < n; j++)
if (((Comparable<Object>)arr[smallIndex]).compareTo(((Comparable<Object>)arr[j])) > 0) // 选择最小的索引j
smallIndex = j;
// if (smallIndex != i) {
exchange(arr, i, smallIndex);// 互换array[i]与 min(array[i+1,..,n])
// }
}
}
有此能够看出利用Object援用来处置通用成绩,当利用实参假如没有完成Comparable接口,编译器会抛出一个castClassException的运转时非常。如许的程序是不平安的。
3.1利用Object援用来泛化一个算法(如按次搜刮)。经由过程利用数组的Object援用和方针值,只需数据范例完成了equals办法,算法中要对照巨细的数据类必需完成Comparable接口,如今我们来用java泛型来办理这个成绩
public static <T extends Comparable<? super T>> void selectionSort(T[] arr){
int n = arr.length;
int smallIndex;
for (int i = 0; i < n-1; i++) {
smallIndex=i;
for (int j = i+1; j < n; j++)
if (arr[j].compareTo(arr[smallIndex])<0)
smallIndex=j;
exchange(arr, smallIndex, i);
}
}
在Arrays类中的静态办法selectionSort(),这个办法处置的是整数范例。要用泛型版原本完成这个算法,因为要泛型范例数组T[]中的两个元素要举行对照,以是传送实参的对象范例或其超类必需完成Comparable接口。