我正在尝试实现一种方法,给定一个通用数组和两个索引值,对该数组进行切片,并在两个给定数字之间找到最大的元素。

<T extends Comparable<? super T>> T max(T[] array, int firstIndx, int secondIndx) {        //requires comparable
    T maxElement = array[0];      //8
    System.out.println(Arrays.toString(array));

    for (int i = firstIndx; i < secondIndx - 1; i++) {
        for (int j = firstIndx + 1; j < secondIndx; j++) {
            if (array[i].compareTo(array[j]) > 0) {
                maxElement = array[i];
                array[i] = array[j];
                array[j] = maxElement;
            }
        }
    }

    System.out.println(Arrays.toString(array));
    return maxElement;
}

但是对于整数数组[8,4,6,20,1],仅正确交换了前两个元素,从而给了我错误的最大元素。代码有什么问题?

最佳答案

您的排序有两个问题。第一个是使用firstIndxsecondIndx,但是根据代码的结构,它将第二个数字视为第二个索引减去1。

第二个问题是您的内循环每次都从firstIndx开始,这破坏了气泡排序。它需要从i开始。

尝试对您的for循环进行此修改:

for (int i = firstIndx; i <= secondIndx - 1; i++) { // Notice the "<=".
    for (int j = i + 1; j <= secondIndx; j++) { // j starts at i
    // ... existing bubble sort code goes here
    }
}

编辑:我没有提到如果最大值已经处于其排序位置,则您的方法将找不到最大值。完成排序后,您应该只从array[secondIndx]获取最大值。

顺便说一句,firstIndx是一个非常糟糕的变量名。完整写出来只剩一个字母:firstIndex

关于java - 如何在以通用数组作为参数的通用方法中实现compareTo?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58594294/

10-11 21:41
查看更多