比较器不适用于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版本。