2012-02-11 117 views
2
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)中,其是絕對相同(除了當然名稱),其我加入兩個的ArrayLists:aListA和aListB。我需要比較兩個對象是否相同。如果它們是相同的,我需要將它們添加到另一個列表(commonList),如果它們碰巧不同,我需要將它們添加到另一個列表(differentList)。我寫了下面的代碼:相等對象比較:JAVA

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); 
} 
} 

我的問題是,即使在2層不同的POJO的數據(這兩個變量,firstId和secondID)是相同的,它們會放在不同的目錄。這意味着對象不會使用ArrayList類的contains()方法進行比較。我不想從POJO中的每個變量中獲取數據並進行比較。有沒有辦法比較兩個變量的POJO,並將其確定爲相等或不相等?

+1

爲什麼有兩個不同的類,如果它們是相同的呢? – 2012-02-11 04:10:43

回答

1

即使內容相同,它們也是不同的對象,這些對象不具有相同的條件。您可能需要通過迭代來顯式執行a.getfirstId()。equals(b.getfirsId())和a.getscondID()。equals(b.getSecondId())。

另一種可能性可能是在兩個POJO類中重寫equals和hashcode方法。請參考此鏈接equals/hashcode contract

+0

好的問題是,這兩個列表可能有不同的數量。在這種情況下,這樣做可能會大大增加時間。ArrayList大小(對象數量)可能會達到1000s。這就是原因,我想避免這種比較。有其他方法可以做到嗎? – Raghu 2012-02-11 04:09:37

+0

然後你可以考慮另一個選項,根據我更新的答案在POJO中添加hashcode/equals override。 – kosa 2012-02-11 04:11:22

+0

這將工作在java1.4? – Raghu 2012-02-11 04:14:14

3

您可以在每個執行字段級比較時執行compareTo(ClassB)或甚至compareTo(CommonInterfaceOrSuperclass)方法,並且如果它們滿足您的比較標準,則返回true。然後你需要迭代你的列表並檢查每個元素。

另一種方法是實現equals()/hashcode()對,這會,當正確編碼,讓您的List查找和比較成功的平等的煩躁。然後您的測試將工作。

+0

我正在使用JAva 1.4。這會在裏面工作嗎? – Raghu 2012-02-11 04:11:03

4

使用Object.equals的默認實現,不同類的兩個對象將永遠不會相同。

如果你想要這種行爲,你需要在你的類中重寫.equals(並且.hashcode也是這樣,看看javadoc)。

(或者製作一個比較器並將它傳遞給你的集合)。

+0

我正在使用Java 1.4 ...將比較工作? – Raghu 2012-02-11 04:11:27

0

你在這裏試圖做的不正確。您正在比較的兩個對象不僅是不同的對象,而且也是不同類型的(ClassAClassB),它們根本沒有關係。

而且,如果你嘗試比較像這樣

if(bList.contains(clsA)) 

當你的bList包含類型ClassBclsAClassA類型的對象,他們將使用java.lang.Object類的equals()方法相比。 因此x.equals(y)返回true當且僅當xy指向同一對象(x == y具有值true)。