在java中使用ArrayList错误的Collections.sort(事先为任何英语错误道歉)

时间:2017-01-11 10:04:09

标签: java sorting arraylist

public class Receipt implements Comparable<Receipt>
{
  private int number;
  private int customer;
  private float amount;
  public static boolean compare_by_customer = false;

 public Receipt(String line){
 // System.out.println(line);
  String[] split = line.split(",");

  number = Integer.parseInt(split[0]);
  //System.out.println(split[1]);


  customer = Integer.parseInt(split[1]);
  //System.out.println(split[1] );


  amount = Float.parseFloat(split[2].substring(1));

    // System.out.println(split[2].substring(1));

    }

    public int compareTo(Receipt other){
   return (compare_by_customer)? customer-other.customer : number-           other.number;
   }

   public String toString(){
     return       String.valueOf(number)+","+String.valueOf(customer)+",$"+String.valueOf(amount);
}
}

我得到了以下错误,尽管我已经在我的收据类中重写了compareTo方法以用作arrayList。任何人都可以解释错误的原因。

Main.java:28: error: no suitable method found for sort(ArrayList<Comparable<Receipt>>)
                      array.sort(array); work = false; break;
                                   ^
    method List.sort(Comparator<? super Comparable<Receipt>>) is not applicable
      (argument mismatch; ArrayList<Comparable<Receipt>> cannot be converted to Comparator<? super Comparable<Receipt>>)
    method ArrayList.sort(Comparator<? super Comparable<Receipt>>) is not applicable
      (argument mismatch; ArrayList<Comparable<Receipt>> cannot be converted to Comparator<? super Comparable<Receipt>>)

5 个答案:

答案 0 :(得分:1)

更改

ArrayList<Comparable<Receipt>> array = reader.getReceipts();

ArrayList<Receipt> array = reader.getReceipts();

使用collections.sort()。it将起作用。

答案 1 :(得分:1)

您实际上是在List对象上调用函数排序

List.sort(Comparator<? super E> c)

它期待Comparator的一个实例,但是你将ArrayList的对象作为参数传递。

您可以致电array.sort(null);

或者,如果您想使用实用程序类集合进行排序,则可以按以下方式调用

 Collections.sort(array);

答案 2 :(得分:0)

尝试ArrayList<Receipt> array = reader.getReceipts();

异常来自您尝试运行的方法调用。 在List上调用的sort()方法将比较器上的实现作为参数,该比较器确定列表中元素的顺序(您需要从该接口实现compare(T o1,T o2)方法,或使用Collections.sort( )使用Coparable接口。

答案 3 :(得分:0)

ArrayList或其超类没有方法sort()。因此,您应该收到编译错误,指出方法sort未定义。

您的收藏品的列表类型也不正确。您可能希望使用Receipt的集合,而不是Comparable类型的对象集合。因此,您的集合解除应该如下所示。(您还应该更改getReceipts方法,以便它返回一个收据的ArrayList。)

ArrayList<Receipt> array = reader.getReceipts();

最后,正确调用Collections.sort()。

case 4: Collections.sort(array); break;

答案 4 :(得分:0)

您需要仔细查看您的大括号如何排列,因为它嵌入在您的主方法中,因为它从未被调用过sortMenu()。我会将sortMenu()方法与下面的主要方法分开,然后从main中调用它。您的Receipt类看起来很好,但是在创建数组并尝试对其进行排序时,您没有正确实现compareTo方法。您需要更改的行是:将main方法和sortMenu方法分开,如下所示。

public static void main(String[] args)
{
  sortMenu(reader);
}

private static void sortMenu(ReceiptReader reader){
{
  boolean work = true, writeback = true;
  Scanner sc = new Scanner(System.in);
  .
  .
  .
}

然后对sortMenu()方法进行更改:

假设您从reader.getReceipts返回了一个好的列表。正如有人已经指出的那样,您应该更改数组定义,如下所示:正如我们已经知道Receipt对象具有可比性。

ArrayList<Receipt> array = reader.getReceipts();

然后使用compareTo对象中的Receipt方法对数组进行排序,请更改以下行。我们使用null来表示我们已经知道它是可比较的,我们想要使用默认的compareTo方法,否则你可以发送一些其他排序方法,这就是为什么它不起作用,因为你发布它。

array.sort(null);

我做了这些改动,但效果很好。希望这会有所帮助。