所以我正在研究一个比较器问题,我无法弄清楚为什么第一堂课中的Array.sort
给我的错误是:
Arrays类型中的方法sort(T [],Comparator)不适用于参数(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;
}
}
答案 0 :(得分:22)
ArrayList
与Java数组不同;由于您使用的是列表,因此Arrays.sort
无法帮助您。
请考虑Collections.sort
。
答案 1 :(得分:3)
忽略Arrays.sort与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;
}
}
}
答案 2 :(得分:2)
Arrays.sort
将数组作为其第一个参数。要对列表等集合进行排序,请使用Collections.sort
。
Collection.sort(elist, new CalorieComparator());
另请注意,您的方法无法编译,因为您没有返回List<Edible>
。
答案 3 :(得分:0)
正如错误消息所示,问题实际上是由传递列表引起的,而不是数组所在的,与比较器无关。
请尝试以下
Arrays.sort(elist.toArray(), new CalorieComparator());
但有了这个,你最终无法获得理想的结果,因为它会对刚刚创建的全新数组进行排序而不是列表本身。但是你应该知道错误信息试图说的是什么。只要确保不要在那里传递一个列表,它就是要对数组进行排序而不是列表。
正如其他人所建议的那样,请使用Collections.sort
方法来获得所需的结果。
另外,只是附注,您应该扩展通用版本Comparator<T>
而不是非通用版本。
答案 4 :(得分:0)
Arrays.sort(elist, new CalorieComparator());
您正在使用sort()
来调用Arrays
ArrayList
个班级,ArrayList
属于Collection
个家庭而不是Array
。
您的错误将得到解决 如果您使用Collectinss.sort()