Найдено: T[], требуется: T[]

#java #algorithm #sorting #generics

#java #алгоритм #сортировка #общие

Вопрос:

Я закодировал алгоритм быстрой сортировки в общих методах с параметрами:

  • Метод разделения: ( T[] array, int low, int high )
  • Метод сортировки: ( T[] array, int low, int high )

Однако, когда я пытаюсь выполнить рекурсию в теле метода сортировки для параметра массива, я получаю эту ошибку:

Неправильный 1-й тип аргумента. Найдено: ‘T[]’, требуется: ‘T[]’

Это код в методе сортировки:

  if (low < high)
        { int pi = partition(array, low, high);
            Quicksort(array, low, pi-1);
            Quicksort(array, pi 1, high);
        }
  

Вот код в методе разделения:

 T pivot = array[high];
        int i = (low-1); // index of smaller element
        for (int j=low; j<high; j  )
        {
            if (array[j].compareTo(pivot) <=0)
            {
                i  ;
                // swap array[i] and array[j]
                T temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }

        // swap array[i 1] and array[high] (or pivot)
        T temp = array[i 1];
        array[i 1] = array[high];
        array[high] = temp;

        return i 1;
  

Я не понимаю, как я могу попытаться исправить ошибку компилятора. Я попытался использовать его как, но он говорит то же самое. (T)array На мой взгляд, ему нужен параметр как в array[index] форме, но это делает мой метод неэффективным.

Есть ли какие-либо предложения, как я могу исправить эту ошибку?


Вот мой полный код:

 public class DD_ObjectBinarySearcher<T> {
    //comparison count for Binary search
    static int binarycount = 0;
    //comparison count for Sequential search
    static int seqcount = 0;
    //comparison totals for calculating averages
    static int stotal; static int btotal;

    /**
     *
     * @return total counts of Sequential Search
     */
    public static int getStotal() {
        return stotal;
    }

    /**
     *
     * @return total counts of Binary Search
     */
    public static int getBtotal() {
        return btotal;
    }

    /**
     * @param array array to be sorted
     * @param low starting index
     * @param high ending index
     * @return partition for quick sort
     */
    static  <T extends Comparable<T>> int partition(T[] array, int low, int high)
    {
        T pivot = array[high];
        int i = (low-1); // index of smaller element
        for (int j=low; j<high; j  )
        {
            if (array[j].compareTo(pivot) <=0)
            {
                i  ;
                // swap array[i] and array[j]
                T temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }

        // swap array[i 1] and array[high] (or pivot)
        T temp = array[i 1];
        array[i 1] = array[high];
        array[high] = temp;

        return i 1;
    }

    /**
     * @param array array to be sorted
     * @param low starting index
     * @param high ending index
     */
    static <T> void Quicksort(T[] array, int low, int high)
    {
        if (low < high)
        { int pi = partition(array, low, high);
            Quicksort(array, low, pi-1);
            Quicksort(array, pi 1, high);
        }
    }

    /**
     * @param a array
     * @param b compared integer
     * @return flag
     */
    static <T extends Comparable<T>> boolean sequentialSearch(T[] a, T b){
        for (T i : a) {
            if (i==b){
                System.out.println("The number of comparisons for unsorted array: "   seqcount);
                stotal =seqcount;
                return true;
            }
            seqcount  ;
        }
        return false;
    }

    /**
     * @param a array
     * @param b compared integer
     * @return flag
     */
    static <T extends Comparable<T>> boolean binarySearch(T[] a, T b) {
        if (a.length == 0) return false;
        int low = 0;
        int high = a.length-1;

        while(low <= high ) {
            int middle = (low high) /2;
            if (b.compareTo((T) a[middle]) > 0){
                low = middle  1;
            } else if (b.compareTo((T) a[middle]) < 0){
                high = middle -1;
            } else { // the element has been found
                System.out.println("The number of comparisons for sorted array: "   binarycount);
                btotal =binarycount; //totals are used to calculate average in the main
                return true;
            }
            binarycount  ;
        }
        return false;
    }

    /**
     *
     * @param array that will be printed
     */
    static void printArray(int[] array)
    {
        for (int value : array) System.out.print(value   " ");
        System.out.println();
    }

}
  

Комментарии:

1. Согласно соглашениям о кодировании Java, классы (и их конструкторы) должны начинаться с заглавной буквы; методы и переменные должны начинаться со строчной буквы. Из-за этого мне было интересно, почему вы дважды вызывали конструктор быстрой сортировки.

Ответ №1:

Каждый из 2 различных общих методов, задействованных здесь, определил параметр типа T . У T in Quicksort нет никаких границ, поэтому его вообще не должно быть Comparable . Однако T in partition должен иметь верхнюю границу Comparable<T> . Ошибка компилятора не указывает всю причину, но ошибка появляется, потому T что границы не совпадают.

Сделайте свою T привязку в Quicksort той же привязке.

 static <T extends Comparable<T>> void Quicksort(T[] array, int low, int high)
  

Обычно для гибкости мы продвигаем эту идею на один шаг дальше, потому что потребитель Супер (от PECS):

 static <T extends Comparable<? super T>> void Quicksort(T[] array, int low, int high)
  

который вы должны добавить ко всем своим T границам, включая ту, для partition которой требуется привязка, и любые другие, для которых требуется привязка.

Поскольку все ваши методы static , T определенные в классе, даже не используются. Вы можете безопасно удалить его.

 class DD_ObjectBinarySearcher {