如何使用java中的泛型方法对每个类型数组进行排序?

Usa*_*Ali 1 java

当我编译我的代码时,它显示 E 无法转换为 int。

public static <E> void sort(E[] ar){
    int swap;

    for (int i = 0; i < ar.length; i++) {
        for (int j = i; j < ar.length - 1; j++) {
            if (ar[j].compareTo(ar[j + 1])) {
                swap = ar[j];
                ar[j] = ar[j + 1];
                ar[j + 1] = swap;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

mar*_*ran 5

首先,您的编译错误来自swap变量的类型。在线上swap = ar[j];,您正试图将一个类型的值放入一个类型E的变量中int。那是类型错误。要解决这个问题,您需要swap通过执行以下操作来更改变量的类型:

E swap;
Run Code Online (Sandbox Code Playgroud)

现在,如果要对泛型类型的对象进行排序,则需要知道如何比较它们。在 Java 中,有两种方法可以做到这一点。要么类型必须实现Comparable接口,要么需要将类型的对象Comparator作为参数。使用 aComparator更灵活,因为它使调用者能够以多种方式轻松地对同一类型进行排序(例如,按时间顺序和颠倒的时间顺序)。

要使您的代码与 a 一起工作Comparable,您需要在您的类型参数上放置一个类型约束。像这样:

public static <E extends Comparable<E>> void sort(E[] ar){
    E swap;

    for (int i = 0; i < ar.length; i++) {
        for (int j = i; j < ar.length - 1; j++) {
            // Now you can use compareTo because E is a Comparable.
            // Also note the "< 0" because compareTo returns an int.
            if (ar[j].compareTo(ar[j + 1]) < 0) {
                swap = ar[j];
                ar[j] = ar[j + 1];
                ar[j + 1] = swap;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是您将如何使用Comparator

public static <E> void sort(E[] ar, Comparator<E> comparator){
    E swap;

    for (int i = 0; i < ar.length; i++) {
        for (int j = i; j < ar.length - 1; j++) {
            if (comparator.compare(ar[j], ar[j + 1]) < 0) {
                swap = ar[j];
                ar[j] = ar[j + 1];
                ar[j + 1] = swap;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过像这样创建比较器来调用该函数:

// Sorting integers in ascending order.
sort(intArr, Comparator.naturalOrder());

// Sorting persons in descending order by age.
sort(personArr, Comparator.comparing(Person::getAge).reversed());
Run Code Online (Sandbox Code Playgroud)

注意:您的代码实际上还没有对任何内容进行排序,因为您的算法是错误的。这是留给你修复:)