HashSet和HashMap上包含方法的一致性

时间:2012-11-12 07:51:17

标签: java hashmap hashset

为什么如果在Set上调用remove,则HashSet上的containsAll方法不会保持一致,而在删除值后,HashMap上的containsValue方法保持一致 从HashSet中删除一个值后,containsAll返回false,即使所有值都存在,在HashMap的情况下,containsValue方法返回正确的值

public static void main(String[] args)
    {

    HashSet<String> lookup=new HashSet<String>();
    HashMap<Integer,String> findup=new HashMap<Integer,String>();

    String[] Alltokens={"This","is","a","programming","test","This","is","a","any","language"};
    for(String s:Alltokens)
        lookup.add(s);

    String[] tokens={"This","is","a"};
    Collection<String> tok=Arrays.asList(tokens);

    lookup.remove(Alltokens[5]); 
     if(lookup.containsAll(tok))
       System.out.print("found");
    else    
        System.out.print("NOT found");

    Integer i=0;
    for(String s:Alltokens)
        findup.put(i++,s);
    boolean found=true;
    findup.remove(Alltokens[0]);
        findup.remove(5);               //Edit : trying to remove value whose key is 5
    for(String s:tokens)
        if(!findup.containsValue(s))
            found=false;
    System.out.print("\nIn map " + found);
}

输出 未找到 在地图中真实

如果在HashSet上调用remove方法,有没有办法保持containsAll一致? 此外,如果传递给集合中不存在的值,则删除method.ContainsAll保持一致

        lookup.remove("Alltokens[5]");
    if(lookup.containsAll(tok))

//现在这将是真的,如果已经存在的值被删除则为false

可能它必须使用HashMaps中的键和HashSet中没有键。可以解释一下它们是如何工作的?

1 个答案:

答案 0 :(得分:5)

Map.remove(Object)根据 删除了地图

由于您使用Integer个对象作为键(put(i++, s)),因此当您拨打findup.remove(Alltokens[0])时,您将删除 nothing !检查其返回值,看它是否会返回false