通过Java泛型实现数组排序和搜索的通用办法[Java编程]
本文“通过Java泛型实现数组排序和搜索的通用办法[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
下面谈论的是数组的排序和搜索功效,而一个通用办法例是实现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在处理范例强迫装换的时刻就会,抛出一个告诫:uncheck cast
@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接口.
以上是“通过Java泛型实现数组排序和搜索的通用办法[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |