2012-01-25 76 views
1

如何使用contains方法包含HashMaps,這樣,當我問列表中是否包含返回true列表上指定的HashMap如何正確使用包含在Java列表保持包含HashMap

例如:

List ssibenefit = new ArrayList(); 
    HashMap map = new HashMap(); 
    map.put("one", "1"); 
    ssibenefit.add(map); 
    HashMap map4 = new HashMap(); 
    map4.put("one", "1"); 

    System.out.println("size: " + ssibenefit.size()); 
    System.out.println("does it contain orig: " + ssibenefit.contains(map)); 
    System.out.println("does it contain new: " + ssibenefit.contains(new HashMap().put("one", "1"))); 

應該返回:

size: 1 
does it contain orig: true 
does it contain new: true 

但在這種情況下,實際產量

size: 1 
does it contain orig: true 
does it contain new: false 

更新

對不起,我已經更新的問題。當我發佈這個問題時,我意識到我想要做什麼,而我所問的並不是同一件事。

回答

5

恐怕到目前爲止(弗拉德的回答之前)給出的答案都是完全垃圾(這很令人驚訝,因爲這是非常基本的東西!)。

的原因,你的測試打印false,你想看到trueput("one", "1")返回的映射,而不是你剛剛操縱地圖的前值。因此,您致電ssibenefit.contains詢問列表是否包含null。它沒有。

在另一方面,如果你重寫你的測試:

HashMap newMap = new HashMap(); 
newMap.put("one", "1"); 
System.out.println("does it contain new: " + ssibenefit.contains(newMap)); 

你會看到,它打印正確的。

如果你讀了List.contains的Javadoc,你會看到,它

返回true當且僅當此列表包含至少一個元素e(O == NULL?è== NULL :o.equals(e))

所以,它的工作原理是平等的,而不是其他人所說的那樣。如果你讀Map.equals的Javadoc,你會看到,它

如果給定對象也是一個映射並且兩個映射表示

所以,平等的定義相同的映射

返回true作爲內容的平等,而不是身份。把這兩者放在一起,你可以看到你想要做的事情必須適用於任何Java的兼容實現。

+0

@mike,我錯了,這是正確的。 – hvgotcodes

+0

ahhh所以沒有必要實施'比較' – Anthony

+0

太棒了!感謝您的帖子。有沒有辦法找到它找到元素的指定位置?如果我能得到它,那麼我可以使用http://docs.oracle.com/javase/6/docs/api/java/util/List.html#get(int)獲取元素。 – Anthony

0

由於您傳遞列表中存在的相同實例,因此它會爲添加的地圖返回true。如果您希望能夠檢查地圖不是完全相同的地圖,則需要在地圖上使用「比較」。

2

HashMap中的put方法返回與該鍵關聯的上一個值,但它不返回HashMap本身。這不是編譯錯誤,因爲containsObject爲參數。

即一邊,List.contains使用equals用於比較和AbstractMap.equals,通過HashMap繼承,對於具有相同的映射關係,不是同一個實例的兩個映射的測試。