2012-01-25 48 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继承,对于具有相同的映射关系,不是同一个实例的两个映射的测试。