【问题标题】:Comparator won't work with Arrays.sort比较器不适用于 Arrays.sort
【发布时间】:2012-10-05 01:18:29
【问题描述】:

所以我正在研究一个比较器问题,但我无法弄清楚为什么第一堂课中的 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());
    }

卡路里比较器类:

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;
    }
}

【问题讨论】:

  • 您可能需要考虑实现 Comparator 而不是在 compare 方法中转换您的对象。

标签: java arrays sorting comparator


【解决方案1】:

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

改用以下方法

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

但是这样你最终不会得到想要的结果,因为它会对刚刚创建的全新数组而不是列表本身进行排序。但是您应该了解错误消息试图表达的内容。只要确保不要在那里传递一个列表,它的目的是对一个数组而不是一个列表进行排序。

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

另外,请注意,您应该扩展通用版本 Comparator&lt;T&gt; 而不是非通用版本。

【讨论】:

  • 在编译时,它会对一个数组进行排序,该数组不能通过该行再次访问。
  • @Vulcan:我正在更新我的答案。不过,这是一个很好的观点。
【解决方案2】:

ArrayList 不同于 Java 数组;由于您使用的是列表,Arrays.sort 在这里帮不了您。

请考虑 Collections.sort。

【讨论】:

    【解决方案3】:

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

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

    另外,请注意,您的方法不会编译,因为您没有返回 List&lt;Edible&gt;。

    【讨论】:

      【解决方案4】:
      Arrays.sort(elist, new CalorieComparator());
      

      您正在使用ArrayList 调用Arrays 类的sort(),ArrayList 属于Collection 家庭而不是Array。

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

      【讨论】:

        【解决方案5】:

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

        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;
            }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2020-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多