2016-05-29 6 views
1

Итак, у меня возникла проблема в моем основном классе, когда я хотел бы вызвать метод mergeSort(), вызванный Comparator. Я получаю следующее сообщение:Проблемы с реализацией Java Comparator - Generics

Image of the error message

Я понятия не имею, как исправить эту проблему .. пожалуйста, помогите мне!

Примечание: Не удивляйтесь, что в коде ничего не происходит. Я застрял, потому что я не могу доказать функциональность моего кода из-за описанной выше проблемы :(

(SRY за мой плохой английский)

class Algorithms 
{ 
    public static <T> void mergeSort(final T[] a, final Comparator<T> c) 
    { 
     T[] list = a; 
     Comparator<T> comp = c; 
    } 
} 


public class Main 
{ 
    public static void main(String[] args) 
    { 
     int[] unsortedList = {4,5,7,1,98,32}; //Expected = 1,4,5,7,32,98 

     Comparator<Integer> sorted = Comparator.naturalOrder(); 
     int[] sortedList = Algorithms.mergeSort(unsortedList,sorted)) 
    } 
} 
+0

Также не помогает, что вы ожидаете, возвращаемое значение из, слияния, который является методом ничтожным. – maccaroo

+0

Да, вы правы! Я думаю, что это произошло при попытке многого, чтобы эта проблема работала ...: D –

ответ

3

В этом коде типы не совпадают в Algorithms.mergeSort вызов:

int[] unsortedList = {4,5,7,1,98,32}; //Expected = 1,4,5,7,32,98 

Comparator<Integer> sorted = Comparator.naturalOrder(); 
Algorithms.mergeSort(unsortedList, sorted)) 

Тип unsortedList является int[] и тип sorted - Comparator<Integer>. Для того, чтобы матч типов, вам нужно использовать Integer[] как тип unsortedList:

Integer[] unsortedList = {4, 5, 7, 1, 98, 32}; //Expected = 1,4,5,7,32,98 

Другая проблема заключается в том, что Algorithms.mergeSort возвращается void, так что это еще не скомпилируется:

int[] sortedList = Algorithms.mergeSort(unsortedList, sorted); 

Необходимо отказаться от услуги:

Algorithms.mergeSort(unsortedList, sorted); 

Собираем вместе, это будет работать (после того, как вы реализуете Algorithms.mergeSort):

public static void main(String[] args) { 
    Integer[] unsortedList = {4, 5, 7, 1, 98, 32}; 

    Comparator<Integer> sorted = Comparator.naturalOrder(); 
    Algorithms.mergeSort(unsortedList, sorted); 
} 
+0

Спасибо за подробный ответ! :) Теперь я понял, почему я должен использовать Integer вместо int! Хорошего дня! :) –

2

Используйте Integer[] вместо int[].

+0

Большое спасибо! Проблема решена .. и это просто! –

0

Другая возможность будет также работать над клоном:

class Algorithm 
{ 
    public static <T> T[] mergeSort(final T[] a, final Comparator<T> c) 
    { 
     T[] list = a.clone(); 
     Comparator<T> comp = c; 
     Arrays.sort(list, comp); 
     return list; 
    } 

    public static void main(String[] args) 
    { 
     Integer[] unsortedList = {4,5,7,1,98,32}; //Expected = 1,4,5,7,32,98 

     Comparator<Integer> sorted = Comparator.naturalOrder(); 
     Integer[] sortedList = Algorithm.mergeSort(unsortedList,sorted); 
    } 
} 
0

Если вы хотите просто вещи для компиляции, вы можете посмотреть на это. Было несколько проблем:

  1. Попытка назначить mergeSort не работает, потому что это метод пустоты.
  2. В настоящее время ваш mergeSort ничего не делает, что вы, вероятно, знаете.
  3. Вышеприведенный ответ правильный, что вам нужно использовать целые числа.
  4. Были проблемы с синтаксисом, такие как нехватка точек с запятой и слишком много парен.

    import java.util.Comparator; 
    
    class Algorithms 
    { 
        public static <T> void mergeSort(final T[] a, final Comparator<T> c) 
        { 
         T[] list = a; 
         Comparator<T> comp = c; 
        } 
    } 
    
    
    public class Main 
    { 
    
    public static void main(String[] args) 
    { 
        Integer[] unsortedList = {4,5,7,1,98,32}; //Expected = 1,4,5,7,32,98 
    
        Comparator<Integer> sorted = Comparator.naturalOrder(); 
        Algorithms.mergeSort(unsortedList,sorted); 
    } 
    } 
    

 Смежные вопросы

  • Нет связанных вопросов^_^