2012-05-03 2 views
0

Так что я следующий методИзменение подписи одного метода

public static <T extends Comparable<? super T>> void bubbleSort(T[] a) 
//public static void bubbleSort(Comparable[] a) 
{ 
    for(int top = a.length-1; top > 0; top--) 
     for(int i = 0; i < top; i++) 
      if(a[i+1].compareTo(a[i]) < 0) 
      { T tmp = a[i]; 

       //Comparabl tmp = a[i]; 
       a[i] = a[i+1]; 
       a[i+1] = tmp; 
      } 
} 

Как изменить сигнатуру метода для того, чтобы быть в состоянии назвать его от чего-то вроде

public int sortByTitle() 
{ 
    return Sorting.bubbleSort(lib); // (lib is lib = new ArrayList<Object>(); 
} 

Я не должен использовать методы сбора или объект компаратора.

ответ

0

Вы используете метод .compareTo, который не реализован классом Object, который, в свою очередь, не сделает вашу работу по сортировке пузырьков, так как не будет реализации метода .compareTo.

В вашем случае, я думаю, было бы лучше создать список элементов массива, который фактически реализует сопоставимый интерфейс, который является противоположностью того, что вы пытаетесь сделать (изменить подпись метода для соответствия вызову метода) ,

Как только вы это сделаете, вы сможете вызвать метод путем преобразования списка в массив с использованием метода toArray.

Еще одна вещь, которую стоит отметить, заключается в том, что ваш метод bubbleSort ничего не возвращает, поэтому ваш вызов метода не должен компилироваться.

+0

Я получаю следующее сообщение об ошибке компиляции: метод bubbleSort в классе Сортировка не может применяться к заданным типам; required: T [] найдено: java.util.List Причина: нет экземпляров переменных типа T, чтобы тип аргумента java.util.List соответствовал формальному типу параметров T [] Оператор, который вы используете здесь, не может использоваться для типа значения, для которого вы его используете. Здесь вы используете неправильный тип или неправильный оператор. – valentin

+0

@valentin: Как указано в моем ответе, вы не можете передать целый массив объектов по той простой причине, что класс 'Object' не реализует интерфейс' Comparable', который вам нужен для вашего механизма сортировки пузырьков Работа. Как я и предложил в ответ, вам нужно будет использовать другой тип данных, который реализует интерфейс 'Comparable'. Как только вы это сделаете, вы сможете заставить его работать. (Пожалуйста, соблюдайте другие предложения, которые я сделал) – npinti

+0

Но если я использую список массивов, как вы предлагаете, не означает ли это, что я должен использовать методы списка, чтобы получить такие вещи, как верх и низ, чтобы запускать его? Я ищу что-то, что не должно использовать методы коллекционирования или объект-компаратор ... Я немного смущен :( – valentin

0

Короче говоря, вы не сможете этого сделать, пока не убедитесь, что элементы lib реализуют Comparable (если вы не можете сравнивать элементы, вы не можете сортировать их).

How do I change the method signature in order to be able to call it from something like

Вы можете изменить его следующим образом:

public static <T extends Comparable<? super T>> void bubbleSort(List<T> a) 

Однако изменение подписи не будет достаточно, так как вы должны были бы использовать .size() вместо .length, .get(i) вместо [i] и т.д. Другими словами, вам придется переписать метод.

Опять же, метод применим только к спискам Comparable, а не к произвольным спискам Object.