2012-10-15 37 views
3

所以我的工作比较问题工作,我想不通,为什么在这个一流的Array.sort是给我的错误:比较不会Arrays.sort

的方法排序(T [],比较器)在类型数组是不适用的参数(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

您可能想要考虑实现比较器,而不是在比较方法中投射对象。 –

回答

22

ArrayList与Java数组不同;由于您使用的是列表,因此Arrays.sort无法帮助您。

改为考虑Collections.sort

0

由于错误信息提示的问题实际上是由清单造成被传递,而不是当阵列的预期,无关比较。

试试下面的不是

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

但随着你不会得到期望的结果,最终,因为它会刚刚创建的,而不是名单本身全新的数组进行排序。但是,你应该知道错误信息是怎么说的。只要确保不在那里传递一个列表,它就是为了排序一个数组而不是一个列表。

正如其他人所建议的,请使用Collections.sort方法来取得预期的结果。

另外,只是一个附注,您应该扩展通用版本Comparator<T>而不是非通用版本。

+2

虽然这将编译,它将排序一个数组,不能再次访问该行。 – Vulcan

+0

@Vulcan:我正在更新我的答案。这是一个很好的观点。 –

2

Arrays.sort将数组作为其第一个参数。要对列表等集合进行排序,请使用Collections.sort

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

此外,请注意你的方法不能编译,因为你没有返回List<Edible>

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

要调用与ArrayListsort()Arrays类,ArrayList属于Collection家庭不是Array

如果使用Collectinss.sort()

2

忽略你用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; 
    } 
    } 
}