2012-03-01 82 views
0

我正在做一个类的任务,我们正在比较一个对象数组Customer,然后向用户提供一些方法。我不断收到一个错误,指出“客户不是抽象的,并且不覆盖java.lang.Comparable中的抽象方法compareTo(Customer)。如果已经在此论坛上讨论过,我很抱歉,但是我找到一个答案时遇到了问题所有这些无意义的。可比较实现中的错误

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Arrays; 
import java.util.Comparator; 
import java.util.Scanner; 


class prog4 { 
public static void main(String args[]) 
      throws FileNotFoundException 
{ 
Scanner kb=new Scanner(System.in); 

Customer [] A =readArray(); //read data into objects in A 

while(true) 
{ 
    System.out.println(); 
    System.out.println(); 
    System.out.println("Please select one of the follwing actions: "); 
    System.out.println("q - Quit"); 
    System.out.println("a - List the customer records sorted by customer name"); 
    System.out.println("b - Enter a customer name to find the customer's record"); 
    System.out.println("c - List the customer records sorted by purchase in descending order"); 
    System.out.println("Please enter q, a, b, or c: "); 

    String selection=kb.nextLine(); //read user's selection 
    if (selection.equals("")) continue; //break; //if selection is "", show menu again 

    switch (selection.charAt(0)) 
    { 
    /*write code to process the following cases*/ 

    case 'a': 

      break; 

    case 'b': 

      break; 

    case 'c': 

      break; 

    case 'q': 

      return; 

    default: 
    } //end switch 
} //end while 
} //end main(); 


    //the following method uses the data from indata.txt 
    //to create Customer objects of an array 
    //and returns the array 

    private static Customer[] readArray() 
        throws FileNotFoundException 
    { 
    String name; 
    double purchase; 
    double rebate; 

    Scanner infile=new Scanner(new File("indata.txt")); //input file 

    int size=infile.nextInt(); //get number of lines 
    infile.nextLine();   //skips end of line 

    Customer A[]=new Customer[size]; 

    for (int k=0; k<size; k++) 
    { 
     //read a name = 16 characters 
     infile.useDelimiter(""); 
     name=""; 

     for (int i=0; i<16; i++) name=name+infile.next(); 
     infile.reset(); 

     purchase=infile.nextDouble(); 
     rebate=infile.nextDouble(); 
     if (infile.hasNextLine()) infile.nextLine(); //skip end of line 

     A[k]=new Customer(name, purchase, rebate); //create object for A[i] 

    } //end for loop 

    infile.close(); 
    return A; 

    } //end readArray 

    //the method prints the Customer objects of the array A 
    //one customer record per line 
    private static void printArray(Customer [] A) 
    { 
    for (Customer x:A) 
    {System.out.println(x);} 
    } //end printArray 
} //end class prog4 


class Customer implements Comparable<Customer> 
{ 
    String name; 
    double purchase; 
    double rebate; 

    public Customer(String n, double p, double r) 
    { name=n; 
    purchase=p; 
    rebate=r; 
    } //end Constructor 

    public Customer(String n) 
    { 
    name=n; 
    } //end Constructor 

    public String toString() 
    { 
    return String.format("%-20s%10.2f%10.2f", name, purchase, rebate); 
    } 

public int compareTo(Customer a, Customer b) 
{return b.name.compareTo(a.name);} 
    } 
//end class Customer 

class descendingPurchase implements Comparator<Customer> 
{ 
public int compare(Customer a, Customer b) 
    { 
    if(a.purchase<b.purchase) return 1; 
    else if(a.purchase==b.purchase) return 0; 
    else return -1; 
    } 
} 
+0

你得到编译错误? – lolo 2012-03-01 23:48:34

回答

0

按照Comparable<T>接口的文档,你应该覆盖的方法是

public int compareTo(T o) 

其中用于比较的第一个对象是this

您正在定义

public int compareTo(Customer a, Customer b) 

它不覆盖正确的方法。这就是为什么Java编译器抱怨你说Customer执行Comparable<Customer>的事实,但实际上你错过了正确的方法。

后者是Comparator<Customer>所需的方法,该方法提供相同的功能,但采用“对象独立”的方式。

1

你的类Customer工具Comparable<Customer>

class Customer implements Comparable<Customer> 

这就要求您实现以下方法

public int compareTo(Customer that) 

注意单个参数。它应该比较thisthat

0

当你实现一个接口时,你必须使用它提供的方法签名。实现接口的要点是让其他人知道你已经实现了他们需要的必要方法。在你的情况下,你有一个方法碰巧在界面中声明了相同的名称,但不是那些知道如何处理Comparable的类所期望的方法。

想象一下,您必须编写一个在其他对象上调用compareTo方法的类。您希望通过单个参数(类型T),并且人们继续使用各种参数类型(字符串,整数,可比较等)以及不同数量的参数实现它们自己的版本,例如compareTo(boolean b, String s, int minMatches)

compareTo(float f, boolean caseSensitive)

你怎么知道哪一个打电话?