Как выполнить этот код с помощью Comparator?

#java #sorting #comparator

#java #сортировка #comparator

Вопрос:

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

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

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

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

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

1. можете ли вы объяснить порядок следования полумесяцев?

2. полумесяц = по возрастанию. Который является: 1,2,3,4,5,6,7…

3. не удается преобразовать из object в int

Ответ №1:

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

 return (Integer) o1 - (Integer) o2;
  

вместо этого.

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

1. Я обновил код. Я мало что понимаю в первом параметре. Не могли бы вы мне помочь? Спасибо.

2. @Seva, первый параметр T[] a представляет собой массив универсального типа T, т.е. класс определяется как MySort<T> .

Ответ №2:

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

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

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

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

 Collections.sort(list, comparator);
  

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

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

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

1. спасибо, но в моем случае у меня уже есть класс сортировки. Я обновил код.

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

3. @Jarrod, я не уверен, чего вы пытались достичь, но ваши обратные ссылки рядом со «Списком или картой» приводят к странностям форматирования.

4. этот код представляет собой алгоритм сортировки, который в настоящее время не реализован в Java 6. Это будет реализовано в Java 7.

5. Если вы используете a, Comparator это уже есть в Java 6. Comparator и ‘Comparable` был в языке с самого начала. Если вы хотите выполнить сортировку Integer , то она уже встроена. Я не вижу в вашем примере кода ничего новаторского, что было бы новым или улучшенным по сравнению с тем, что Integer уже есть.

Ответ №3:

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

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

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

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

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

1. Я обновил код. Я мало что понимаю в первом параметре. Не могли бы вы мне помочь? Спасибо.

2. спасибо за векторное обучение. Но я все еще не могу скомпилировать, потому что метод sort ожидает параметр T[] a .

3. @Seva: Где это T определено? Это не универсальный метод, поэтому он должен быть установлен содержащим его классом. Что содержит сигнатура класса sort() ?