1

まず、このように作成された2つのオブジェクトがあります...

Recipe recipeOne = new Recipe("Pepperoni Pizza");

    Ingredient one = new Ingredient("Dough", 1, UnitOfMeasurement.valueOf("Pounds"));
    Ingredient two = new Ingredient("Sauce", 8, UnitOfMeasurement.valueOf("Ounces"));
    Ingredient three = new Ingredient("Cheese", 10, UnitOfMeasurement.valueOf("Ounces"));

    recipeOne.addIngredient(one);
    recipeOne.addIngredient(two);
    recipeOne.addIngredient(three);

    RecipeBook.addRecipe(recipeOne);

    Recipe recipeTwo = (Recipe) recipeOne.clone();
    recipeTwo.addIngredient(recipeOne.Ingredients[0]);
    recipeTwo.addIngredient(recipeOne.Ingredients[1]);
    recipeTwo.addIngredient(recipeOne.Ingredients[2]);

    RecipeBook.addRecipe(recipeTwo);

    recipeTwo.setName("Pineapple Pizza");

ここで驚くことはありません。すべて明らかなことが起こっていますが、それから私はそれらが等しいかどうかをチェックしたいと思います!そして、私はそれらのすべての要素を明らかにチェックして、それらが本当に等しいかどうかを確認しようとしています。したがって、「System.out.println(recipeOne.equals(recipeTwo));」と呼びます。ここに行きます...

public boolean equals(Object obj){

    if(obj instanceof Recipe){

        Recipe tempRec = (Recipe) obj;

        for(int j = 0 ; j < Ingredients.length ; j++){

            if(Ingredients[j].equals(tempRec.Ingredients[j]) == true){

                return true;

            }

        }

    }

    return false;

}

これで不完全であることがわかり、recipeOneの最初の材料である「Ingredients []」と、recipeTwoの最初の材料である「tempRec.Ingredients[]」のみをチェックします。さて、私の質問は、「平等の大丈夫」を送信する前に、残りの場所をチェックして、それらがすべて等しいことを確認するにはどうすればよいですか?forループに戻って次のスポットを確認する方法はありますか?すべてのtrueを保存し、すべてがわかったら、最終的にtrueを返す方法はありますか?すべての場所がnullかどうかをチェックし、成分が等しいかどうかをチェックするifステートメントを10個書きたくありません笑

(私のIngredient.equals()をほとんど忘れてしまいました。ここでは参照用ですが、正常に機能します!)

public boolean equals(Object obj){

    if(obj instanceof Ingredient){

        Ingredient tempIngred = (Ingredient) obj;

        if(Name.equals(tempIngred.getName()) && Quantity == (tempIngred.getQuantity()) &&
                unitOfMeasurement.equals(tempIngred.getUnit()))
                return true;

    }

    return false;   

}
4

1 に答える 1

2

条件を反転し、return true最後にのみ:

public boolean equals(Object obj){

    if (!obj instanceof Recipe) return false;
    if (obj == this) return true;

    Recipe tempRec = (Recipe) obj;

    for(int j = 0 ; j < Ingredients.length ; j++) {
        if(!Ingredients[j].equals(tempRec.Ingredients[j])) {
            return false;
        }
    }

    return true;
}

さらに良いことに、既存のライブラリメソッドを使用して作業を行いますArrays.equals(Object[] a1, Object[] a2)

public boolean equals(Object obj){

    if (!obj instanceof Recipe) return false;
    if (obj == this) return true;

    Recipe tempRec = (Recipe) obj;
    return Arrays.equals(this.Ingredients, tempRec.Ingredients);
}
于 2013-02-11T23:20:02.220 に答える