Компаратор не будет работать с 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>
вместо неуниверсального.