Я хочу знать, как проверить, имеют ли два объекта одного и того же класса одинаковые значения в каждом атрибуте.
Например:
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
Единственное, о чем я могу думать, это сравнить атрибуты один к одному. Есть ли более простой способ?
Извините за мой английский
заранее спасибо
Нет более простого способа. Вы должны реализовать свой собственный способ сделать это, потому что это класс, который вы создали сами.
Вы отправитесь в хорошее начало. Вы можете использовать свой 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;
}
Возможно, с некоторой проверкой нулевой проверки и всем, что вам нужно.
Единственное, о чем я могу думать, это сравнить атрибуты один к одному. Есть ли более простой способ?
К сожалению нет. Вам нужно будет написать код, чтобы сделать именно это. И если вы это сделаете, подумайте о том, чтобы поместить этот код в методы equals
и hashCode
.
equals()
и hashCode()
.
Правильный ответ использует equals() и hashCode(), но если вы ищете что-то еще, вы можете подумать о вводе идентификатора для каждого человека - возможно, номера социального страхования. Тогда сравнение лиц может быть реализовано в public boolean isSamePersonAs(Person person)
и сравнить только это.
Вы должны указать, как должен сравниваться объект
и чтобы он сравнил, правильно применяйте метод 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;
}
prime
?
Люди пробуют это, я думаю, это сработает для вас
*********** Это класс "Человек" *********
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;
}
}
Спасибо и с уважением.
Обычно вы используете геттер для каждого поля. Вы должны использовать общий путь здесь и называть всех получателей через отражение на каждом экземпляре, после чего сравнивать их с равными.
@Edit См. Здесь: Java Reflection: как я могу получить все методы getter класса java и вызывать их
и здесь: http://tutorials.jenkov.com/java-reflection/getters-setters.html