2013-02-11 2 views
1

Сначала я два объекта созданы как так ...Использование равных для проверки Массивы объектов

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 который «Ингредиенты []» и первый ингредиент в recipeTwo, копия, «tempRec.Ingredients []». Теперь мой вопрос: как проверить остальные местоположения и убедиться, что все они равны, прежде чем отправлять «правильное равенство»? Есть ли способ вернуться в цикл for и проверить следующее место, возможно, сохранить все истины, тогда, когда все они будут поняты и, наконец, вернутся? Я бы предпочел не выписывать 10 утверждений, проверяющих все местоположения, независимо от того, являются ли они нулевыми или нет, а затем проверяет, равны ли ингредиенты lol

(Почти забыл свой 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; 

} 

ответ

2

Invert состояние, и только 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); 
} 
+0

Не хочу ли я все же оставить этот последний возврат ложным и вернуть значение true после цикла for? Я все еще хочу убедиться, что объект, который я передаю, фактически является объектом Рецепта – Sherifftwinkie

Смежные вопросы