Сравнение объектов на равенство: JAVA - PullRequest
2 голосов
/ 11 февраля 2012
public ClassA
{
private String firstId;
private String secondId;

public void setFirstId(String firstId) {
           this.firstId = firstId;
   }


   public String getFirstId() {
           return id;
   }

   public void setSecondId(String secondId) {
           this.secondId = secondId;
   }


   public String getSecondId() {
           return secondId;
   }
}



public ClassB
{
private String firstId;
private String secondId;


   public void setFirstId(String firstId) {
           this.firstId = firstId;
   }


   public String getFirstId() {
           return id;
   }

   public void setSecondId(String secondId) {
           this.secondId = secondId;
   }

   public String getSecondId() {
           return secondId;
   }
}

У меня есть 2 вышеупомянутых класса (POJO), которые абсолютно одинаковы (за исключением названия курса), которые я добавляю к двум массивам: aListA и aListB.Мне нужно сравнить, если два объекта одинаковы.Если они одинаковы, мне нужно добавить их в другой список (commonList), и если они окажутся разными, мне нужно добавить их в другой список (differentList).Я написал следующий код:

ClassA clsA = null;
public ArrayList genCommonList(aList, bList)
{

for(int i = 1; i<aList.size(); i++)
{
clsA = new ClassA;
Object obj = aList.get(i);
clsA = (ClassA)obj;
if(bList.contains(clsA)
{
genCommonList.add(clsA);
}
}

public ArrayList genDifferentList(aList, bList)
{

for(int i = 1; i<aList.size(); i++)
{
clsA = new ClassA;
Object obj = aList.get(i);
clsA = (ClassA)obj;
if(!bList.contains(clsA)
{
 genDifferentList.add(clsA);
}
}

Моя проблема в том, что даже когда данные (обе переменные, firstId и secondID) в 2 разных POJO одинаковы, они помещаются в другой список.Это означает, что объекты не сравниваются на равенство с помощью метода contains () класса ArrayList.Я не хочу получать данные из каждой переменной внутри POJO и сравнивать.Есть ли способ сравнить POJO для обеих переменных и определить их как равные или неравные?

Ответы [ 4 ]

4 голосов
/ 11 февраля 2012

При реализации Object.equals по умолчанию два объекта разных классов никогда не будут одинаковыми.

Если вы хотите такое поведение, вам нужно переопределить .equals в ваших классах (и .hashcode, также посмотрите на javadoc).

(Или создайте компаратор и передайте его в свои коллекции).

3 голосов
/ 11 февраля 2012

Вы можете реализовать метод compareTo(ClassB) или даже compareTo(CommonInterfaceOrSuperclass) в каждом, который будет выполнять сравнение на уровне поля и вернет true, если они соответствуют вашим критериям сравнения. Затем вам нужно будет перебрать списки и проверить каждый элемент.

Другой альтернативой является реализация пары equals() / hashcode(), которая при правильном кодировании позволила бы вашему List успешно найти и сравнить на равенство. Ваш contains() тест будет работать.

1 голос
/ 11 февраля 2012

Несмотря на то, что содержимое одинаковое, это разные объекты, которые не удовлетворяют одинаковым условиям.Вам может потребоваться сделать явные a.getfirstId (). Equals (b.getfirsId ()) и a.getscondID (). Equals (b.getSecondId ()) путем итерации.

Другая возможность может быть переопределениемметоды equals и hashcode в обоих классах POJO.Перейдите по этой ссылке для равно / хэш-код контракта .

0 голосов
/ 11 февраля 2012

То, что вы пытаетесь сделать здесь, не правильно.2 сравниваемых объекта - это не только разные объекты, но и разные типы (ClassA и ClassB), у которых вообще нет реляционных.

Более того, если вы попытаетесь сравнить таким образом

if(bList.contains(clsA))

Поскольку ваш bList содержит объекты типа ClassB, а clsA имеет тип ClassA, они будут сравниваться с использованием equals() метода класса java.lang.Object.Поэтому x.equals(y) возвращает true тогда и только тогда, когда x и y ссылаются на один и тот же объект (x == y имеет значение true).

...