簡體   English   中英

如何在資源類中重寫equals()方法?

[英]How to override equals() method in a resource class?

我正在讀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等於另一個Pizza需要什么? 您已在需求中列出了標准,因此實施equals將涉及比較thisp那些字段並確定兩者是否相等。

compareTo()的策略相似。 您的Pizza必須實現,例如Comparable<Pizza> ,然后重寫int compareTo(Pizza) 實現的行為應符合Comparable.compareTo()文檔中的定義,並且用於確定結果的確切邏輯取決於問題描述中給出的要求。

我建議閱讀有關第1部分的重寫方法的官方教程和有關第2部分的對象排序的官方教程。它們簡潔明了,編寫精巧,將為您提供解決這些類型問題所需的工具。

要覆蓋方法,您需要聲明與原始方法完全相同的方法。 使用@Override注釋強制執行此操作很有幫助。

對於equals() ,您將從以下內容開始:

@Override
public boolean equals(Object o) {
  :
}

該框架通常為:

@Override
public boolean equals(Object o) {
  if (o instanceof Pizza) {
    // Do the comparison for Pizza objects.
  } else {
    // A Pizza object can only be equal to other Pizza objects.
    return false;
  }
}

首先,您應該在equals函數上方添加@Override標記,因為您要覆蓋Object的equals()函數。 您的教授告訴您要驗證兩個比薩餅的澆頭,大小和成本是否相同,這意味着您應該比較兩個比薩餅的某些變量,而不是像現在一樣嘗試比較一個完整的比薩餅與另一個完整的比薩餅(p == ??)。

您會想要這樣的東西:

@Override
public Boolean equals(Object o)
{
    //Make sure its a pizza
    if (o instanceof Pizza == false)
        return false;

    //Cast to a pizza
    Pizza p = (Pizza)o;

    //Compare the fields
    if(this.size == p.getSize() && this.cost == p.getCost() && this.topping == p.getTopping())
        return true;
    else
        return false;
}

非常簡單,您可以通過在派生類中使用相同的方法簽名定義方法來覆蓋超類中的方法。 在Object中,.equals方法定義為:

public boolean equals(Object obj)

因此,您可以在類中創建一個具有相同簽名的方法並提供實現。 您沒有要求接口部分,但是無論如何都不能包含它。 接口是合同。 它定義了對象實現接口時必須具有的方法簽名,但是不提供實現。 如果您沒有在簽名與接口中定義的簽名相匹配的方法中提供實現,則會導致編譯時錯誤。 在這里,您只想添加關鍵字Implements,然后再添加要在類聲明中實現的接口,然后執行與equals方法幾乎完全相同的操作,僅使用compareTo。

請參閱http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html此處的.equals,並比較此處http://docs.oracle.com/javase/7/docs/api/ java / lang / Comparable.html

對於equals(),您需要這樣的東西:

public boolean equals (Object o){
    boolean res=false;
    if (o instanceof Pizza){
        Pizza p0 = (Pizza) o;
        res=getTopping().equals(p0.getTopping())&&getSize().equals(p0.getSize())&&getCost().equals(p0.getCost());
    }
    return res;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM