2011-06-16 47 views
1

伊夫遇到一個很好的問題,最近, 我有一個地圖比較的地圖,列出了在Java

LinkedHashMap<String, List<MyCustomObject>> 

我需要與此相比,另一個地圖,將在完全相同的方法來填充的數據在DB中是一樣的。

真正發生的是,我在時間0填充map1,並在時間t填充map2,使用相同的java方法(當我這樣說時,我的意思是使用相同的DB /表格等) 因此,如果在數據庫方面的數據是相同的,那麼這兩個地圖應該有相同的內容,在相同的順序(希望!!)

現在我想比較這兩個地圖,如果他們不相等(即一些新的數據是從數據庫中提取的),然後我想要做一些動作。如果它們是相同的,我只想離開它。

有人可以指出我是否可以幫助我瞭解如何做到這一點?

是序列化的答案嗎?

感謝, Neeraj

+1

你想知道差異還是隻想知道兩者是否有所不同? – 2011-06-16 12:15:39

+0

我只是想知道他們是否有差異。 – Neeraj 2011-06-16 12:16:06

+0

Java序列化不是答案。 'equals'有什麼問題? – 2011-06-16 12:18:44

回答

4

只需使用equals

if (!map1.equals(map2)) { 
    //they differ 
} 

你將不得不實施equalsMyCustomObject,因爲(如果我理解正確的話)的對象將具有相同(和hashCode!)內容但身份不同(默認equals只比較指針 - 即對象所在的內存地址)。

2

確保您MyCustomObject類實現一個適當的equalshashcode方法,然後它作爲獲取的map1.equals(map2)結果一樣簡單。

這就是javadocs不得不說一下吧:

比較指定對象與 此映射的相等。如果 給定的對象也是一個映射,並且兩個映射表示相同的映射,則返回true。 更正式地,如果 t1.entrySet()。equals(t2.entrySet()),則兩個映射t1和t2 表示相同的映射。 這確保等式方法 在Map接口的不同 實現中正常工作。

1

其他答案很好,下面的例子說明了map函數遍歷鍵和值(以及比較列表中的項)進行等式比較。正如他們所說,你將需要重寫hashCode和equals。

static public List<String> getStringList(String... arg) { 
    ArrayList<String> arrayList = new ArrayList<String>(); 
    for(int x=0;x<arg.length;x++) arrayList.add(arg[x]); 
    return arrayList; 
} 

static public void main(String[] arg) { 
    LinkedHashMap<String, List<String>> mapA = new LinkedHashMap<String, List<String>>(); 
    LinkedHashMap<String, List<String>> mapB = new LinkedHashMap<String, List<String>>(); 
    LinkedHashMap<String, List<String>> mapC = new LinkedHashMap<String, List<String>>(); 
    mapA.put("same", getStringList("a", "b", "c")); 
    mapB.put("same", getStringList("a", "b", "c")); 
    mapC.put("same", getStringList("a", "b", "d")); 
    System.out.println(mapA.equals(mapB) ? "true" : "false"); 
    System.out.println(mapA.equals(mapC) ? "true" : "false"); 
}