0

为什么在 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);
}

在地图中未找到输出 true

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

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

//如果已经存在的值被删除,这将是真的,因为它是假的

可能它必须与 HashMaps 中的键和 HashSet 中的键无关。你能解释一下它们是如何工作的吗?

4

1 回答 1

5

Map.remove(Object)删除基于key的映射。

由于您使用Integer对象作为键 ( ),因此您在调用时put(i++, s)不会删除任何内容findup.remove(Alltokens[0])!检查它的返回值,看看它是否会返回false

于 2012-11-12T07:55:55.113 回答