Компаратор не будет работать с Arrays.sort

Так что я работаю над проблемой компаратора, и я не могу понять, почему Array.sort в этом первом классе дает мне ошибку:

Метод sort(T[], Comparator) в типе Arrays не применим для аргументов (ArrayList, CalorieComparator)

Ресторанный класс:

import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

public class Restaurant {
    private ArrayList<Edible> elist;

    public Restaurant() {
    }

    public void addEdibleItem(Edible item){
        elist.add(item);
    }

    public List<Edible> orderByCalories(){
        Arrays.sort(elist, new CalorieComparator());
    }

Класс CalorieComparator:

import java.util.Comparator;
public class CalorieComparator implements Comparator {

    public int compare(Object o1, Object o2){
        Edible thisfood = (Edible)o1;
        Edible otherfood = (Edible)o2;
        if(thisfood.getCalories() > otherfood.getCalories())
            return 1;
        else if (thisfood.getCalories() < otherfood.getCalories())
            return -1;
        else 
            return 0;
    }
}

5 ответов

Решение

ArrayList отличается от массива Java; так как вы используете список, Arrays.sort здесь тебе не поможет

Рассматривать Collections.sort вместо.

Игнорируя вашу реальную проблему с Arrays.sort vs. Collections.sort (на которую был дан прекрасный ответ), было бы неплохо реализовать Comparator<Edible> вместо приведения ваших объектов в методе сравнения:

public class CalorieComparator implements Comparator<Edible> {

  @Override
  public int compare(Edible o1, Edible o2) {        
    if (o1.getCalories() > o2.getCalories()) {
        return 1;
    } else if (o1.getCalories() < o2.getCalories()) {
        return -1;
    } else {
        return 0;
    }
  }
}

Arrays.sort принимает массив в качестве первого аргумента. Чтобы отсортировать коллекцию, такую ​​как список, используйте Collections.sort,

Collection.sort(elist, new CalorieComparator());

Также обратите внимание, что ваш метод не будет компилироваться, потому что вы не возвращаете List<Edible>,

Arrays.sort(elist, new CalorieComparator());

Вы звоните sort() из Arrays класс с ArrayList, ArrayList принадлежит Collection семья не Array,

Ваша ошибка будет решена, если вы используете Collectinss.sort()

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

Попробуйте следующее

Arrays.sort(elist.toArray(), new CalorieComparator());

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

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

Кроме того, только примечание, вы должны расширить общую версию Comparator<T> вместо неуниверсального.

Другие вопросы по тегам