Как реализовать CompareTo в универсальном методе, который принимает универсальный массив в качестве аргумента? - PullRequest
2 голосов
/ 28 октября 2019

Я пытаюсь реализовать метод, который, учитывая универсальный массив и два значения индекса, разрезает массив и находит самый большой элемент между двумя заданными числами.

<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] корректно меняет местами только первые два элемента, давая мне неправильные максимальные элементы. Что не так с кодом?

1 Ответ

3 голосов
/ 28 октября 2019

Есть две проблемы с вашим видом. Во-первых, вы используете firstIndx и secondIndx, но в зависимости от структуры вашего кода это второе число обрабатывается так, как если бы это был второй индекс минус 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...