2010-10-16 1 views
4

У меня есть массив объектов, которые я хочу сравнить с целевым объектом. Я хочу вернуть количество объектов, которые точно соответствуют целевому объекту.Сравнение двух объектов с использованием метода equals, Java

Вот мой метод подсчета:

public int countMatchingGhosts(Ghost target) { 
     int count=0; 
     for (int i=0;i<ghosts.length;i++){ 
      if (ghosts[i].equals(target)); 
      count++; 
     } 
     return count; 

А вот мой метод равно:

public boolean equals(Ghost other){ 
      if(this == other) return true; 
      if(!(other instanceof Ghost)) return false; 
      Ghost p = (Ghost)other; 

     if (this.x == p.x && this.y == p.y && this.direction==p.direction && this.color.equals(p.color)) 
      return true; 
     else 
      return false; 

Я бегу некоторые тестового кода, и я ожидаю только 1 соответствия, но я получаю 3 вместо этого. Вы видите ошибки?

+1

какие поля имеет Ghost и как инициализируются призраки? Я думаю, что массив имеет неповторимые значения. – Bivas

ответ

16

Существует ; в конце вашего if:

if (ghosts[i].equals(target)); 
          ^

Это делает count++; случиться всегда независимо от того, что ваш equals метод возвращает.

+0

Вау, я идиот ... спасибо. – Snowman

+5

Вот почему я всегда использую фигурные скобки. взял мои 2 дня, чтобы однажды найти что-то подобное. Больше никогда... – hvgotcodes

3

Вы должны переопределить эту функцию:

public boolean equals(Object other) { } 

ли обратите внимание Object класса используется в методе подписи вместо Ghost. Вы можете использовать аннотацию @Override, чтобы получить ошибку компилятора, если вы неправильно используете подпись метода.

@Override 
public boolean equals(Object other) { } 

Сказав, что, что, вероятно, происходит в вашем коде, что другой ответ о том, ...

0

Просто думал, что я добавлю, что при реализации метода equals в вашем коде, вы также должны реализовать (переопределить) метод hashCode. Это общий контракт, который вы должны соблюдать для лучших выступлений.

Ниже приводится отрывок из книги Joshua Bloch «s "Effective Java"

Пункт 9: Всегда переопределить хэш-код при переопределении равно

A common source of bugs is the failure to override the hashCode method. You 
must override hashCode in every class that overrides equals. Failure to do so 
will result in a violation of the general contract for Object.hashCode, which will 
prevent your class from functioning properly in conjunction with all hash-based 
collections, including HashMap,HashSet, and Hashtable. 
Here is the contract, copied from the Object specification [JavaSE6]: 
• Whenever it is invoked on the same object more than once during an execution 
    of an application, the hashCode method must consistently return the 
    same integer, provided no information used in equals comparisons on the 
    object is modified. This integer need not remain consistent from one execution 
    of an application to another execution of the same application. 
• If two objects are equal according to the equals(Object) method, then calling 
    the hashCode method on each of the two objects must produce the same 
    integer result. 

И точно так же, как сказал Пабло, если вы используете что-нибудь другое чем класс Object в вашей сигнатуре метода equals, вы фактически не переопределяете метод equals, и ваша программа не будет работать должным образом.

Возьмите, к примеру, эту небольшую программу, которая копирует List в Set (который не может содержать дубликаты) и печатает новую коллекцию. Попробуйте поменять equals(Object obj) на equals(Item obj) и посмотреть, что произойдет, когда вы запустите программу. Кроме того, закомментируйте метод hashCode() и запустите программу и обратите внимание на разницу между ее использованием и нет.

public class Item { 
     private String name; 
     private double price; 
     private String countryOfProduction; 

public Item(String name, double price, String countryOfProduction) { 
    this.setName(name); 
    this.setPrice(price); 
    this.setCountryOfProduction(countryOfProduction); 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public double getPrice() { 
    return price; 
} 

public void setPrice(double price) { 
    this.price = price; 
} 

public String getCountryOfProduction() { 
    return countryOfProduction; 
} 

public void setCountryOfProduction(String countryOfProduction) { 
    this.countryOfProduction = countryOfProduction; 
} 

public String toString() { 
    return "Item Name: " + getName() + "\n" + 
      "Item Price: N" + getPrice() + "\n" + 
      "Country of Production: " + getCountryOfProduction() + "\n"; 
} 

@Override 
public boolean equals(Object obj) { 
    if(!(obj instanceof Item)) { 
     return false; 
    } 
    if(obj == this) { 
     return true; 
    } 

    Item other = (Item)obj; 
    if(this.getName().equals(other.getName()) 
       && this.getPrice() == other.getPrice() 
       && this.getCountryOfProduction().equals(other.countryOfProduction)) { 
     return true; 
    } else { 
     return false; 
    } 

} 

public int hashCode() { 
    int hash = 3; 

    hash = 7 * hash + this.getName().hashCode(); 
    hash = 7 * hash + this.getCountryOfProduction().hashCode(); 
    hash = 7 * hash + Double.valueOf(this.getPrice()).hashCode(); 
    return hash; 

} 

public static void main (String[]args) { 

    List<Item> items = new ArrayList<>(); 


    items.add(new Item("Baseball bat", 45, "United States")); 
    items.add(new Item("BLUESEAL Vaseline", 1500, "South Africa")); 
    items.add(new Item("BLUESEAL Vaseline", 1500, "South Africa")); 


    Collection<Item> noDups = new HashSet<>(items); 


    noDups.stream()      
      .forEach(System.out::println); 
    } 
    } 

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

  • Нет связанных вопросов^_^