java 当处理Comparable接口时,我需要指定一个参数类型泛型吗?

s2j5cfk0  于 2023-01-11  发布在  Java
关注(0)|答案(2)|浏览(181)

我有一个选择排序算法,它适用于任何实现了类似接口的数据类型(例如整型、双精度、字符型)。

public class SelectionSort {
    public static void sort(Comparable[] a) {
        int n = a.length;

        for (int i = 0; i < n; i++) {
            int min = i;

            for (int j = i; j < n; j++)
                if (less(a[j], a[min]))
                    min = j;

            exchange(a, i, min);
        }
    }

    private static boolean less(Comparable a, Comparable b) {
        return a.compareTo(b) < 0;
    }

    private static void exchange(Comparable[] a, int i, int j) {
        Comparable temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    public static boolean isSorted(Comparable[] a) {
        for (int i = 1; i < a.length; i++)
            if (less(a[i], a[i - 1]))
                return false;

        return true;
    }
}

然而,我收到了多个警告,告诉我“Comparable是一个原始类型。对泛型类型Comparable的引用应该被参数化”。我需要将该类实现为泛型还是可以让它保持原样?如果我需要将该类实现为泛型,我该如何做,因为方法是静态的。

6mw9ycah

6mw9ycah1#

它是具有泛型方法的非泛型类。

public class SelectionSort {
    public static <T extends Comparable<T>> void sort(T[] a) {
        int n = a.length;

        for (int i = 0; i < n; i++) {
            int min = i;

            for (int j = i; j < n; j++)
                if (less(a[j], a[min]))
                    min = j;

            exchange(a, i, min);
        }
    }

    private static <T extends Comparable<T>> boolean less(T a, T b) {
        return a.compareTo(b) < 0;
    }

    private static <T extends Comparable<T>> void exchange(T[] a, int i, int j) {
        T temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    public static <T extends Comparable<T>> boolean isSorted(T[] a) {
        for (int i = 1; i < a.length; i++)
            if (less(a[i], a[i - 1]))
                return false;

        return true;
    }

    public static void main(String[] args) {
        Integer [] arr = {4,9,5,2,67};
        SelectionSort.sort(arr);
        for(int j=0; j<arr.length; j++){
            System.out.println(arr[j]);
        }
    }
}

如果您在类未实现Comparable接口的对象上调用sort方法,则此代码将抛出Exception

58wvjzkj

58wvjzkj2#

以下是更新的代码:

public class SelectionSort {
public static <T extends Comparable<T>> void sort(T[] a) {
    int n = a.length;

    for (int i = 0; i < n; i++) {
        int min = i;

        for (int j = i; j < n; j++)
            if (less(a[j], a[min]))
                min = j;

        exchange(a, i, min);
    }
}

private static <T extends Comparable<T>> boolean less(T a, T b) {
    return a.compareTo(b) < 0;
}

private static <T extends Comparable<T>> void exchange(T[] a, int i, int j) {
    T temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

public static <T extends Comparable<T>> boolean isSorted(T[] a) {
    for (int i = 1; i < a.length; i++)
        if (less(a[i], a[i - 1]))
            return false;

    return true;
}

}
以下是您现在可以使用“选择”排序的方法:

Integer[] intArray = {5, 4, 3, 2, 1};
SelectionSort.sort(intArray);

相关问题