我正在读AP计算机科学(高​​中阶段),但仍在尝试掌握我们在课堂上学习的一些知识。我们最近得到了一个修改“ Pizza”资源类的任务。他在工作表中的指示是:

第1部分:
修改先前编写的旧Pizza类。
添加一个equals()方法,该方法将覆盖Object类中的一个方法。
      如果浇头,大小和成本相同,则两个比萨饼对象相等。
      使用PizzaMatch类测试新方法。

第2部分:
添加compareTo()方法以实现接口Comparable。
这个compareTo()应该可以帮助您在pizza.txt中找到最便宜的比萨。**

他想要的输出是

**Part 1 Output
Input a Pizza topping, size, and cost:
sloppyJoe 15 15.30
That pizza is # 20 in the file.
ÏÏÏ
Input a Pizza topping, size, and cost:
cheese 12 12.99
That pizza is not in the file.
Part 2 Output
The cheapest pizza: The 9 inch olive pizza will cost   $7.99**


这是披萨(资源类)

 import java.util.*;
 import java.io.*;
 class Pizza
{
  private int size;
  private double cost;
  private String topping;
  public Pizza(int pizzaSize, double pizzaCost,String pizzaTopping)
  {
     size = pizzaSize;
     cost = pizzaCost;
     topping = pizzaTopping;
  }
  public void setSize(int input)
  {
     size = input;
  }
  public void setCost(double input)
  {
     cost = input;
  }
  public void setTopping(String input)
  {
     topping = input;
  }
  public int getSize()
  {
     return size;
  }
  public double getCost()
  {
     return cost;
  }
  public String getTopping()
  {
     return topping;
  }

  public String toString()
  {
     return (size + " inch " + topping + " pizza will cost $" + cost);
  }
}


这是PizzaMatch

  import java.util.*;
  import java.io.*;

public class PizzaMatch   {
   public static void main (String [] args)throws Exception
   {

     Scanner keyboard = new Scanner(System.in);
     System.out.println("Input a Pizza topping, size, and cost: ");
     String top = keyboard.next();
     int size = keyboard.nextInt();
     double cost = keyboard.nextDouble();
     Pizza input = new Pizza(size, cost, top);
     int counter =1;
     boolean found = false;
     while(inFile.hasNext())
     {
        String t = inFile.next();
        int s = inFile.nextInt();
        double c = inFile.nextDouble();
        Pizza temp = new Pizza(s,c,t);
       //System.out.println("Pizza #"+counter+"\t" + temp);
        if(temp.equals(input))
        {
           System.out.println ( "That pizza is # " + counter
              + " in the file.");
           found = true;
        }
        counter++;
     }
     if(!found)
        System.out.println("That pizza was not in the file.");

  }
}


基本上,我不确定从哪里开始。我仍然不确定接口。我意识到我们必须制作一个.equals()方法,但是怎么做呢?我开始写

public Boolean equals(Pizza p)
{
 if(p==/*this is where I don't know what to write*/)
return true;
}


对于作业的第1部分和第2部分,任何帮助将不胜感激!非常感谢 :)

最佳答案

如果要覆盖基类的方法,则通常子类方法应具有与基类相同的签名。

如果查看Object.equals()的文档,您会发现它实际上返回了boolean,而不是Boolean。另外,它采用Object参数,而不是Pizza参数。因此,在您的情况下,在Pizza中,您需要:

public boolean equals (Object o) {
    if (!(o instanceof Pizza))
        return false; // its null, or its not Pizza
    Pizza p = (Pizza)o;
    // compare relevant fields of 'this' with 'p' and return result.
    return ...;
}


注意,顺便说一下,Java有一个@Override批注,您应该使用该批注来标记旨在覆盖基本方法的方法:

@Override
public boolean equals (Object o) {
    if (!(o instanceof Pizza))
        return false; // its null, or its not Pizza
    Pizza p = (Pizza)o;
    // compare relevant fields of 'this' with 'p' and return result.
    return ...;
}


如果您在原始示例中使用了此批注,则编译器将生成一个错误,指出您的equals()方法实际上并未覆盖基数。

至于实际的实现,则取决于您。如何使一个Pizza等于另一个?您已在需求中列出了标准,因此实施equals将涉及比较thisp的字段,并确定两者是否相等。

compareTo()的策略相似。您的Pizza必须实现,例如Comparable<Pizza>,然后覆盖int compareTo(Pizza);实现应符合Comparable.compareTo()文档中的定义,并且用于确定结果的确切逻辑取决于问题描述中给出的要求。

我建议阅读第1部分有关Overriding Methods的官方教程,以及第2部分有关Object Ordering的官方教程。这些语言简洁明了,编写精良,将为您提供解决这些类型问题所需的工具。

09-30 17:11
查看更多