【问题标题】:Consistency of contains method on a HashSet and HashMapHashSet 和 HashMap 上 contains 方法的一致性
【发布时间】:2012-10-31 15:44:30
【问题描述】:

为什么在 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 一致? 此外,如果将集合中不存在的值传递给 remove 方法。ContainsAll 保持一致

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

//如果已经存在的值被删除,这将是正确的,因为它是错误的

可能与 HashMaps 中的键有关,而 HashSet 中没有键。您能解释一下它们是如何工作的吗?

【问题讨论】:

  • lookup.remove(Alltokens[5]); 之后缺少一些东西。
  • 以上代码无法编译。您应该发布实际代码,并且应该添加 { } 而不是允许单行语句为您带来这些问题,因为您重构代码并且它们从单行变为多行。
  • @JoachimSauer 抱歉 if 条件丢失。现在编辑它

标签: java hashmap hashset


【解决方案1】:

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

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

【讨论】:

  • 我将其更改为 findup.remove(5) 即使它返回 true。此外,如果我传递了一个键或一个值,这将如何计算。如果该方法将键作为参数获胜't 在 findup.remove(Alltokens[0]) 的情况下尝试将字符串转换为整数
  • 1.) 5="This" 和 "This" 在您的地图中包含两次:一次在 0,一次在 5。所以即使您删除了 5,“This”仍然包含在地图的值和 2.) 不,String 永远不会是 equalInteger,所以它永远不会删除任何东西。大多数时候,Java 不会为您进行自动类型转换。
  • 如果在 Alltokens[5] 被删除后的 HashSet 的情况下,因为它不包含重复的 'This' 不再存在并且它返回 false。但是为什么不 findup.remove(Alltokens [0]) 给出错误。将字符串传递给接受整数的函数不是错误吗?
  • 编译的原因是remove() 接受Object,无论密钥类型是什么。 reason is complicated大多数时候传递不属于你的密钥类型的东西是错误的,但不幸的是,这个决定是固定的,不能轻易改变。
猜你喜欢
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
相关资源
最近更新 更多