Comparator无法与Arrays.sort一起使用。

3

我正在解决一个比较器问题,但是我无法理解为什么第一个类中的 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;
    }
}

1
你可能想考虑实现一个Comparator<Edible>,而不是在compare方法中强制转换你的对象。 - Clayton Louden
5个回答

22

ArrayList与Java数组不同;因为你使用的是List,所以Arrays.sort在这里无法帮助你。

考虑使用Collections.sort代替。


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

Arrays.sort 接受一个数组作为第一个参数。如果要对诸如列表这样的集合进行排序,请使用 Collections.sort

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

另外需要注意的是,你的方法无法编译,因为你没有返回一个 List<Edible>


0

正如错误信息所提示的那样,问题实际上是由于传递了列表而期望数组引起的,与比较器无关。

请尝试使用以下方法

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

但是,这样做最终不会得到所期望的结果,因为它将对刚创建的全新数组进行排序,而不是列表本身。但是,你应该明白错误消息试图告诉你什么。确保不要传递一个列表,它是用来对数组进行排序的,而不是列表。

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

此外,只是一个小提示,你应该扩展泛型版本的Comparator<T>,而不是非泛型版本。


2
虽然这个代码可以编译通过,但它会对一个数组进行排序,且排序后无法再通过该行访问该数组。 - FThompson
@Vulcan:我正在更新我的答案。不过那是个好观点。 - Bhesh Gurung

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

你正在使用 ArrayList 调用 Arrays 类的 sort() 方法,但是 ArrayList 属于 Collection 家族而不是 Array
如果你使用 Collections.sort(),你的错误将会被解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接