Использование компаратора в ArrayList

#java #comparator

#java #компаратор

Вопрос:

Я пытался отсортировать ArrayList<E> с помощью пользовательского компаратора, показанного ниже

 @Override
public int compare(Dog d1, Dog d2){
    return Integer.compare(d1.tired, d2.tired);
};
  

Теперь это все, что я хочу начать работать, прежде чем двигаться дальше:

 public static <E> ArrayList<E> listBiggest(ArrayList<E> list) {
    Dog dogcomparator = new Dog();
    Collections.sort(list, dogcomparator);
}
  

Хотя я не могу отсортировать список, потому что, по-видимому, в списке нет объектов, соответствующих типу компаратора, хотя в списке есть все объекты этого типа или объекты, которые его расширяют.

Я не уверен, что я делаю неправильно.

Ошибка, которую я получаю, это

 Error:(15, 20) java: no suitable method found for sort(java.util.ArrayList<E>,Dog)
method java.util.Collections.<T>sort(java.util.List<T>) is not applicable
  (cannot infer type-variable(s) T
    (actual and formal argument lists differ in length))
method java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>) is not applicable
  (inference variable T has incompatible bounds
    equality constraints: E
    lower bounds: Dog,java.lang.Object)
  

Я упускаю что-то фундаментальное, о чем я не знаю? Достаточно ли вообще информации, чтобы понять суть того, что я пытаюсь спросить?

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

1. Вы путаете comparator с comparable ? Вкл Dog dogcomparator = new Dog(); . , это не компаратор dog, это просто Dog .

2. Какую ошибку вы получаете? Есть ли трассировка стека? Если нет, покажите с помощью ввода и вывода, что вы ожидаете и что получаете.

3. @Vitruvius У меня есть метод сравнения как часть моего класса Dog. Я предполагаю, что объект dog будет использовать его компаратор.

4. @AbhijitSarkar Я включил ошибку, которую я получил. Я ожидаю, что мой ArrayList<E> будет отсортирован с помощью созданного мной компаратора

Ответ №1:

У вас есть a List<E> , который вы хотите отсортировать с помощью a Comparator<Dog> . Компилятор не знает, что это E ; все, что он знает, E может быть a Person . Если вы уверены, что это список dogs, приведите его.

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

1. Хорошо, это имеет большой смысл, почему это не работает. Теперь, есть ли способ, которым я могу это сделать, прежде чем пытаться отсортировать список, чтобы я мог сохранить общий список до вызова этого конкретного метода?

2. @Yalnix я не уверен, о чем ты спрашиваешь. Я предлагаю вам приостановить копирование кода, который вы нашли в Интернете, и взять книгу по Java.

Ответ №2:

Измените сигнатуру метода. Если все, что там требуется, должно быть каким Dog -то, тогда объявите это.

 public static <E extends Dog> List<E> listBiggest(List<E> list) {
  

Лучше объявить List (интерфейс, который ArrayList реализует) так Collections.sort же, как и это. Это позволит использовать метод для любого списка, а не только для одной конкретной реализации.

Вам также нужно будет добавить a return к методу или задать возвращаемый тип void метода.

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

1. В первую очередь этот метод не нужен, но это другой вопрос.