Как сделать этот код с помощью Comparator?

Извините, я давно не работаю с Java. У меня есть класс типа int, и я пытаюсь это сделать, но это не компилируется:


MySort.sort(vectorOfInt, new Comparator() {
    @Override
    public int compare(Object o1, Object o2) {
    return (int)o1 - (int)o2;
    }
    });

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


public static  void sort(T[] a, Comparator c) {
        sort(a, 0, a.length, c);
}


person alansiqueira27    schedule 03.05.2011    source источник
comment
Вы можете объяснить порядок полумесяца?   -  person Bala R    schedule 03.05.2011
comment
полумесяц = ​​восходящий. А именно: 1,2,3,4,5,6,7...   -  person alansiqueira27    schedule 03.05.2011
comment
не может преобразовать из объекта в int   -  person alansiqueira27    schedule 03.05.2011


Ответы (3)


Пример кода довольно неполный, но для начала вы не можете привести Object к типу int. Использовать

return (Integer) o1 - (Integer) o2;

вместо.

person Nils Weinander    schedule 03.05.2011
comment
Я обновил код. Я мало что понимаю в первом параметре. Не могли бы вы помочь мне? Спасибо. - person alansiqueira27; 03.05.2011
comment
@Seva, первый параметр T[] a представляет собой массив универсального типа T, т.е. класс определен как MySort‹T›. - person Nils Weinander; 03.05.2011

Во-первых, не используйте Vector или Hashtable в этом отношении, они оба считаются deprecated для всех практических целей. Используйте реализации List или Map.

Вместо этого используйте List<Integer>, это современный и правильный способ манипулирования списком Integer как объектов.

final List<Integer> list = new ArrayList<Integer>();
... populate list ...
Collections.sort(list);

Если вы хотите использовать другой Comparator, вы можете использовать:

Collections.sort(list, comparator);

Поскольку Integer реализует Comparable, по умолчанию List<Integer> будет сортироваться в порядке возрастания. Integer для получения подробной информации.

Это правильный идиоматический способ сортировки классов List и Collection в современной Java. Все остальное показывает, что вы не понимаете язык и то, что он дает.

person Community    schedule 03.05.2011
comment
спасибо, но в моем случае у меня уже есть класс сортировки. Я обновил код. - person alansiqueira27; 03.05.2011
comment
вы делаете это неправильно, вам никогда не следует повторно реализовывать код, который уже есть в стандартной библиотеке. - person ; 03.05.2011
comment
@Jarrod, я не уверен, чего вы пытались достичь, но ваши обратные кавычки рядом со списком или картой вызывают странности форматирования. - person Pops; 03.05.2011
comment
этот код представляет собой алгоритм сортировки, который в настоящее время не реализован в Java 6. Он будет реализован в Java 7. - person alansiqueira27; 03.05.2011
comment
Если вы используете Comparator, это уже в Java 6. Comparator и «Comparable» были в языке с самого начала. Если вы хотите отсортировать Integer, то он уже встроен. Я не вижу в вашем примере кода ничего принципиально нового или улучшенного по сравнению с тем, что уже делает Integer. - person ; 03.05.2011
comment
вы неправильно поняли, новая вещь, о которой я говорю, это алгоритм TimSort. В настоящее время это настроенная быстрая сортировка или настроенная сортировка слиянием. - person alansiqueira27; 03.05.2011

Вы можете создать типизированный компаратор, и вы выиграли Не нужно приводить аргументы.

MySort.sort(vectorOfInt, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
      return o1 - o2;
    }
    });

EDIT:
Во-первых, пожалуйста, не называйте массив вектором. Vector – это класс Java, и люди предполагают, что это то, что вы используете, когда называете переменную vectorOfInt.

Ошибка компилятора, которую вы получаете, связана с тем, что компилятор не знает, что ваш Comparator работает с Integers. Поскольку все, что он видит, это Object, он не знает, что o1 на самом деле является Integer и может быть распакован, чтобы быть int. Указав тип компаратора, вы предоставляете больше информации, и преобразование может быть выполнено неявно.

person unholysampler    schedule 03.05.2011
comment
Я обновил код. Я мало что понимаю в первом параметре. Не могли бы вы помочь мне? Спасибо. - person alansiqueira27; 03.05.2011
comment
спасибо про вектор учите. Но я все еще не могу скомпилировать, потому что метод сортировки ожидает параметр T[] a. - person alansiqueira27; 03.05.2011
comment
@Seva: Где определяется T? Это не общий метод, поэтому он должен быть установлен содержащим его классом. Какая сигнатура класса содержит sort()? - person unholysampler; 04.05.2011