我已经为可比较数组,插入,合并和选择编写了排序方法,我通过改变我之前从排序int数组中获得的代码来完成此操作,而我只是将事物从int更改为Comparable。但是,当我为int数组做的时候,我非常清楚如何实际使用该方法,例如这是我对int的选择排序:
public void selectionSort(int[] list){
for (int i=0;i<list.length;i++){
for (int si=i;si<list.length;si++){
if (list[si]<list[i]){
int temp=list[i];
list[i]=list[si];
list[si]=temp;
}
}
}
}
这是最终使用此方法的代码:
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int numItems,searchNum,location;
Sorts sort=new Sorts();
int[]test;
System.out.print("Enter the number of elements: ");
numItems=in.nextInt();
test=new int[numItems];
for (int i=0;i<test.length;i++){
test[i]=(int)(100*Math.random());
}
System.out.println("Unsorted: ");
displayArray(test);
sort.selectionSort(test);
System.out.println("Sorted: ");
displayArray(test);
并且一切正常,但对于我的可比选择排序,我有这个代码:
public static void selectionSort(Comparable[] list){
for (int i=0;i<list.length;i++){
for (int si=i;si<list.length;si++){
if (list[si].compareTo(list[i])<0){
Comparable temp=list[i];
list[i]=list[si];
list[si]=temp;
}
}
}
}
但是当我编写代码来测试这个方法时,我根本不知道如何处理它,我不知道如何制作一个Comparable接口数组,这个概念对我来说太困惑了而且我找不到让它发挥作用的方法。
答案 0 :(得分:5)
Integer
实现了Comparable
,因此写法是合法的:
Comparable[] list = new Comparable[3];
list[0] = Integer.valueOf(3);
list[1] = Integer.valueOf(2);
list[2] = Integer.valueOf(3);
通过查看JavaDoc,您可以在标准JDK中看到Comparable
的所有实现者。
问题是(你应该看到一些编译器警告),你不能同时为Comparable
指定泛型参数并创建一个参数化对象的数组,也就是说,它不是 合法写作:
Comparable<Integer>[] list = new Comparable<Integer>[3];
即使编写它是合法的,您也会遇到一个新问题,因为您需要在Comparable<T>
测试中使用具体类型。 Comparable<T>
需要与T
类型的对象进行比较(方法为int compareTo(T o)
)。从本质上讲,您的代码只能运行,因为它是未参数化的(T
隐式Object
,所有内容都扩展为Object
),但您在此过程中会丢失一些编译时安全检查。
通过一组通用参数化Comparable
对象而不是Comparable
数组来参数化输入可能更有意义。使用泛型编写这个有点棘手,方法原型看起来像:
public static void <T extends Comparable<T>> selectionSort(T[] list) {
// legal to call list[k].compareTo, because `T` is guaranteed to be `Comparable`
}
值得注意的是,这适用于任何实现T
的非原始对象类型Comparable<T>
,例如Integer[]
或Double[]
,但不是 int[]
。