【发布时间】: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 条件丢失。现在编辑它