2012-08-01 48 views
5

有比較器的任何Equalator機制,所以我可以有不同的等值用於複製列表嗎?我的目標是區分當前的list1.equals(list2),它檢查它是一個淺拷貝還是一個深拷貝與所有對象a.equals(b)和list1.identical(list2)哪一個檢查它是否與未修改列表中的簡單淺拷貝在Collection中有不同的等於(物理等於和邏輯等於)對象的機制

所有這些列表都來自同一模型。有些是他們自己的副本,所以他們持有指向相同對象的指針,而另一些是深度副本,因此層次結構被完全複製,因爲他們在內容中進行了更新,而不僅僅是結構化。我發現自己經常makin list1.equals(list2),但我需要一種機制來告訴如果兩者都是TOTAL副本(集合相同順序的相同對象),或者有時如果他們是LOGICAL副本(通過我自己實現的邏輯等於),所以列表會調用equals並且對象應該實現比a == b更多的東西。

我的問題是不存在Equalator接口,並且如果我重寫對象等於我鬆由TOTAL相等(A == B)

例如進行比較的能力,這將是很好;

Collections.equal(l1,l2,new Equalator(){ 
    @Override public boolean equals(Obj1,Obj2){ 
      //Default lists comparison plus commparison of objects based on 
      return (obj1.propertyX() == obj2.propertyX()); 
    } 
}); 

和我還是可以做list1.equals(列表2),因此他們使用默認的equals(OBJ1 == obj2的),如果包含的對象是完全一樣的,這將是唯一的真實。

第一個操作是用於檢查列表(這可能是一個更新的清單,從模型完全重新創建對象)還是等於舊列表非常有用。

第二個操作對於檢查列表(它是舊的當前版本的數據模型的淺表副本)非常有用,它不包含任何在代碼內部移動時發生的超越變化,因爲它是udpdated版本。

編輯:一個很好的例子是有一個Point(x,y)的列表。我們應該能夠知道這兩個列表是否相等,因爲它們是完全相同的一組點或相等的點,因爲它們包含的點在邏輯上是相等的。如果我們可以將phyEqual和logEqual都實現爲對象,並且在任何對象中都有這兩種方法,那麼list.phyEqual(list2)或list1.logEqual(list2)

+0

你有很多的上下文,但是這裏你真正的*問題*是什麼? – 2012-08-01 11:38:57

+0

第一行。然後我定義我的問題。對不起,我從'不存在'開始,而不是'存在',我認爲這就是爲什麼其混淆的 – Whimusical 2012-08-01 11:39:35

回答

2

您的問題並沒有真正遇到,至少對我而言。如果這不能正確回答,你可以重新說一點嗎?

在給定的收集具體類型,最等於已經實現你暗示什麼。 例如:

public boolean equals(Object o) { 
     if (o == this) 
      return true; 

在這種情況下,這樣的事情可能是有意義的。
您可以輕鬆地重寫此:如果您正在創建標準的集合

@Override 
    public boolean equals(Object o) { 
     if (o.getPrimaryKey() == this.getPrimaryKey()) 
      return true; 
     return super().equals(o); 

[測試空值應加] ,你甚至可以匿名覆蓋建設中的equals方法。

如果你想要的東西,這並不這樣做,你可以自己擴展集合和覆蓋任何的存在的方法做了類似的事情。

這是否幫助?

+0

列表至少有一個相等的,看起來兩個列表具有相同的大小,相同的元素和相同的順序。問題在於,如果兩個對象都是相同的,那麼它就會使用相等的方法,所以這意味着如果沒有等式界面,我必須更改整個框架才能獲得額外的平等鏈。我可以在我的對象中實現等於邏輯或實體的平等,但是我無法將其切換到其他類型 – Whimusical 2012-08-01 12:21:48

+0

很少有真實世界的情況,其中有多個實際上適用於任何人的等值定義。 – 2012-08-01 12:35:21

+0

列表。 list.equals(list2)如果它們的大小,元素和順序相同(如果它們滿足a.equals(b),則考慮到它們是等於的)。但是list.equals2(list2)可能意味着它們都具有相同的大小,元素和順序(如果a == b,考慮到2 obj是等於的)。當然,假設我們不能保證a.equals(b)沒有被覆蓋,所以不會超過a == b – Whimusical 2012-08-01 12:46:42

2

逾期的答案,但也許這將是有用的人......

番石榴Equivalence類是等價的比較比較相同。你需要編寫自己的方法來比較列表(在Guava中沒有支持),但是你可以用各種等價定義來調用這個方法。

或者你可以滾你自己的界面:

interface Equalator<T> { 
    boolean equals(T o1, T o2); 
} 

同樣,你需要編寫你的(簡單)方法

boolean <T> listEquals(List<T> list1, List<T> list2, Equalator<T> equalator) { 
    ... 
} 

...但你可以用不同的ListEqualator實現重用。