比较器不适用于Arrays.sort

所以我正在研究比较器问题,我无法弄清楚为什么第一类中的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 elist; public Restaurant() { } public void addEdibleItem(Edible item){ elist.add(item); } public List 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; } } 

ArrayList与Java数组不同; 因为你正在使用List,所以Arrays.sort对你没有帮助。

请考虑使用Collections.sort

忽略Arrays.sort与Collections.sort的实际问题(已经得到了很好的回答),实现Comparator而不是在compare方法中强制转换对象可能是个好主意:

 public class CalorieComparator implements Comparator { @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

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

您正在使用ArrayList调用Arrays类的sort()ArrayList属于Collection系列而不是Array

如果您使用Collectinss.sort(),您的错误将得到解决

由于错误消息表明问题实际上是由传递列表引起的,而不是在期望数组的情况下,与比较器无关。

请尝试以下方法

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

但有了这个,你最终无法得到理想的结果,因为它会对刚创建的全新数组进行排序,而不是列表本身。 但是你应该知道错误信息试图说的是什么。 只要确保不在那里传递列表,它就是要对数组进行排序而不是列表。

正如其他人建议的那样,请使用Collections.sort方法来获得所需的结果。

另外,只需注意,您应该扩展通用版本Comparator而不是非generics版本。