我正在读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
将涉及比较this
和p
的字段,并确定两者是否相等。compareTo()
的策略相似。您的Pizza
必须实现,例如Comparable<Pizza>
,然后覆盖int compareTo(Pizza)
;实现应符合Comparable.compareTo()
文档中的定义,并且用于确定结果的确切逻辑取决于问题描述中给出的要求。我建议阅读第1部分有关Overriding Methods的官方教程,以及第2部分有关Object Ordering的官方教程。这些语言简洁明了,编写精良,将为您提供解决这些类型问题所需的工具。