#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()
?