Java: проверьте, имеют ли два объекта одного класса одинаковые значения

1

Я хочу знать, как проверить, имеют ли два объекта одного и того же класса одинаковые значения в каждом атрибуте.

Например:

public class Person {
String name;
String surname;
String country;
int age;    

public Person(String name, String surname, String country, int age) {
    this.name = name;
    this.surname = surname;
    this.country = country;
    this.age = age;
}

public boolean samePerson(Person person){
    //CODE
}


Person person1 = new Person("Abel", "Smith", "EEUU", 26);
Person person2 = new Person("Alexa", "Williams", "Canada", 30);
Person person3 = new Person("Abel", "Smith", "EEUU", 26);
Person person4 = new Person("Alexa", "Williams", "EEUU", 30)


person1.samePerson(person2) // return false
person1.samePerson(person3) // return true
person2.samePerson(person3) // return false
person2.samePerson(person4) // return false

Единственное, о чем я могу думать, это сравнить атрибуты один к одному. Есть ли более простой способ?

Извините за мой английский

заранее спасибо

  • 1
    Обычно вы переопределяете метод equals из класса объекта, но нет более простого способа, если вы считаете, что два человека одинаковы, если все значения их атрибутов одинаковы.
  • 6
    переопределить equals () и hashCode ()
Показать ещё 1 комментарий
Теги:

6 ответов

4

Нет более простого способа. Вы должны реализовать свой собственный способ сделать это, потому что это класс, который вы создали сами.

Вы отправитесь в хорошее начало. Вы можете использовать свой samePerson() для предоставления этой функции или, как сказал @Thilo, использовать методы equals и hashCode.

Он должен идти по строкам:

public boolean samePerson(Person person){
   return this.name.equals(person.name) &&
          this.surname.equals(person.surname) &&
          this.country.equals(person.country) &&
          this.age == person.age;
}

Возможно, с некоторой проверкой нулевой проверки и всем, что вам нужно.

4

Единственное, о чем я могу думать, это сравнить атрибуты один к одному. Есть ли более простой способ?

К сожалению нет. Вам нужно будет написать код, чтобы сделать именно это. И если вы это сделаете, подумайте о том, чтобы поместить этот код в методы equals и hashCode.

  • 0
    +1, для этого случая предпочтительно создать метод equals() и hashCode() .
0

Правильный ответ использует equals() и hashCode(), но если вы ищете что-то еще, вы можете подумать о вводе идентификатора для каждого человека - возможно, номера социального страхования. Тогда сравнение лиц может быть реализовано в public boolean isSamePersonAs(Person person) и сравнить только это.

0

Вы должны указать, как должен сравниваться объект

и чтобы он сравнил, правильно применяйте метод hashcode.

код, как показано ниже, добавьте это в свой класс, и вы получите желаемый о/р.

@Override
    public int hashCode() {
        int prime=31;
        int sum = prime*this.name.hashCode();
        sum=sum+this.surname.hashCode();
        sum=sum+this.country.hashCode();
        sum=sum+this.age;
        return sum;
    }

@Override
    public boolean samePerson(Object p) {
    if(p==null)
        return false;
    if(! (p instanceof Person))
        return false;
    Person person = (Person)p;

        return this.name.equals(person.name) && this.surname.equals(person.surname) && this.country.equals(person.country) && this.age == person.age;
    }
  • 0
    что использование переменного prime ?
-2

Люди пробуют это, я думаю, это сработает для вас

*********** Это класс "Человек" *********

public class Person {
String name;
String surname;
String country;
int age;    

public Person(String name, String surname, String country, int age) {
    this.name = name;
    this.surname = surname;
    this.country = country;
    this.age = age;


  }


}

******** Это основной класс *******

public class mainclass {

    public static void main(String arg[])
    {
        Person person1 = new Person("Abel", "Smith", "EEUU", 26);
        Person person2 = new Person("Alexa", "Williams", "Canada", 30);
        Person person3 = new Person("Abel", "Smith", "EEUU", 26);
        Person person4 = new Person("Alexa", "Williams", "EEUU", 30);
        System.out.println(samePerson(person1,person2)); 
        System.out.println(samePerson(person1,person3)); 
        System.out.println(samePerson(person2,person4)); 
        System.out.println(samePerson(person3,person4)); 
        System.out.println(samePerson(person1,person4)); 

    }
    static boolean samePerson(Person personA,Person personB)
    {    
      if(personA.name.equals(personB.name) && personA.country.equals(personB.country)&& personA.surname.equals(personB.surname )&& personA.age==personB.age )
         return true;  
      else
    return false;

   }
}

Спасибо и с уважением.

-3

Обычно вы используете геттер для каждого поля. Вы должны использовать общий путь здесь и называть всех получателей через отражение на каждом экземпляре, после чего сравнивать их с равными.

@Edit См. Здесь: Java Reflection: как я могу получить все методы getter класса java и вызывать их

и здесь: http://tutorials.jenkov.com/java-reflection/getters-setters.html

  • 2
    Нет .. Обычно вы этого не сделаете. Отражение здесь не предлагается.
  • 0
    Хорошо, вы бы не делали это сами, но это то, что, например, Apache Commons EqualsBuilder делает с помощью mirrorEquals - вам так не кажется? информация на сайте: commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/…
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню