排序可比较的接口阵列

ay *_*mao 0 java arrays sorting interface comparable

我已经为可比较数组,插入,合并和选择编写了排序方法,我通过改变我之前从排序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;
            }
        }
    }        
}
Run Code Online (Sandbox Code Playgroud)

这是最终使用此方法的代码:

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);    
Run Code Online (Sandbox Code Playgroud)

一切正常,但对于我的可比选择排序,我有这个代码:

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;
            }
        }
       }
    }
Run Code Online (Sandbox Code Playgroud)

但是当我编写代码来测试这个方法时,我只是不知道如何处理它,我不知道如何制作一个可比较的接口数组,这个概念对我来说太混乱了,我可以找不到让它发挥作用的方法.

Mar*_*iot 5

Integer例如,实现Comparable,所以写法是合法的:

Comparable[] list = new Comparable[3];
list[0] = Integer.valueOf(3);
list[1] = Integer.valueOf(2);
list[2] = Integer.valueOf(3);
Run Code Online (Sandbox Code Playgroud)

您可以Comparable通过查看JavaDoc来查看标准JDK中的所有实现者.

问题是(你应该看到一些编译器警告),你不能同时指定泛型参数Comparable并创建参数化对象的数组,也就是说,编写它是合法的:

 Comparable<Integer>[] list = new Comparable<Integer>[3];
Run Code Online (Sandbox Code Playgroud)

即使编写它是合法的,您也会遇到一个新问题,因为您需要在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`
 }
Run Code Online (Sandbox Code Playgroud)

值得注意的是,这会为任何非原始对象类型工作T实现Comparable<T>,如一个Integer[]Double[],但不是一个int[].