HashMap java中的Remove方法不起作用

HashMap java中的Remove方法不起作用,java,hashmap,Java,Hashmap,我已使用方法“remove(key)”删除了映射,但仅删除了值。当我调用keySet()方法时。钥匙还在那儿!!。 在下面的程序中,我想找到两组(HashMap中的2个map)有最短的距离。然后合并它们,这意味着我需要删除这两个组,并将合并的组放到地图上 /* I have already initiate the HashMap groups*/ ArrayList<String> listGroupNames ; while (currentNumberOfGroup >

我已使用方法
“remove(key)”
删除了映射,但仅删除了值。当我调用
keySet()
方法时。钥匙还在那儿!!。 在下面的程序中,我想找到两组(HashMap中的2个map)有最短的距离。然后合并它们,这意味着我需要删除这两个组,并将合并的组放到地图上

/* I have already initiate the HashMap groups*/
ArrayList<String> listGroupNames ;
while (currentNumberOfGroup > 1000){
  System.out.println("Groups" + currentNumberOfGroup);
  listGroupNames  =  new ArrayList<String>(groups.keySet());
  /*  Name of two groups will be merged*/
  String candidate1 = "";
  String candidate2 = "";
  double maxSimilarity = 0;

  /* finding two groups which have shortest distance*/
  for(String event1 : listGroupNames){
    for(String event2 : listGroupNames){
      if(!event1.equalsIgnoreCase(event2)){
          Group group1 = groups.get(event1);
          Group otherGrp = groups.get(event2);
          double similarity = group1.getMaxSimilarityWith(otherGrp, simpledEvent);
          if(similarity > maxSimilarity){
            maxSimilarity = similarity;
            candidate1 = event1;
            candidate2 = event2;
          }
      }
    }
  }
  /*  2 groups have shortest distance were found already*/
  /* Merge 2 groups then replace these two groups by merged group*/
  Group groupCandidate1 = groups.get(candidate1) ;
  Group groupCandidate2 = groups.get(candidate2) ;
  Group mergerdGroup = groupCandidate1.mergeToOtherGroup(groupCandidate2);
  /*remove 2 found groups*/
  groups.remove(candidate2);
  groups.remove(candidate1);

  groups.put(mergerdGroup.name, mergerdGroup);
  listGroupNames.clear();
  currentNumberOfGroup --;      
}
/*我已经启动了HashMap组*/
ArrayList列表组名;
而(currentNumberOfGroup>1000){
System.out.println(“组”+currentNumberOfGroup);
listGroupNames=newArrayList(groups.keySet());
/*将合并两个组的名称*/
字符串candidate1=“”;
字符串candidate2=“”;
双最大相似性=0;
/*寻找距离最短的两组*/
对于(字符串事件1:ListGroupName){
对于(字符串事件2:ListGroupName){
如果(!event1.equalsIgnoreCase(event2)){
group1=groups.get(event1);
groupothergrp=groups.get(event2);
双重相似性=group1.getMaxSimilarityWith(otherGrp,SimpleEvent);
如果(相似性>最大相似性){
最大相似性=相似性;
候选1=事件1;
候选2=事件2;
}
}
}
}
/*已找到距离最短的两组*/
/*合并两个组,然后用合并组替换这两个组*/
groupgroupcandidate1=groups.get(candidate1);
groupgroupcandidate2=groups.get(candidate2);
groupmergerdgroup=groupCandidate1.mergetouthergroup(groupCandidate2);
/*删除找到的2个组*/
组。移除(候选2);
组。移除(候选1);
groups.put(mergerdGroup.name,mergerdGroup);
listGroupNames.clear();
currentNumberOfGroup--;
}

您没有包含足够的代码,我们无法正确诊断问题,因此这是一个一般性的答案

您可以断言已使用
groups.remove(key)
删除了一个密钥,但当您通过
groups.keyset()返回的对象查看密钥时,该密钥仍然存在

这是“不可能发生的”。如果钥匙被取下,它将不在钥匙集中。此外,由于键(看起来)是
String
对象,我们实际上可以排除
equals
hashcode
存在问题的可能性

那么有什么可能的解释呢?这里有一些

  • 两个上下文中的
    对象是不同的
  • 在移除和检查钥匙组之间添加一个或多个钥匙。(例如,
    mergerdGroup.name
    实际上等于
    candidate1
    candidate2
  • 钥匙其实不一样。。。他们只是看起来一样

@PatriciaShanahan-钥匙似乎是字符串……让我困惑的是,你如何“知道”钥匙还在那里。我想我们需要一个SSCE来了解这里发生了什么。无论如何,看看
groupCandidate1.mergeTotherGroup
会有帮助,这样我们就知道
mergerdGroup.name
是如何确定的了。@StephenC说得好。@HoaVu-我们需要一个SSCE。谢谢。我发现很难上传所有的代码。这很复杂。我会按照你的建议检查代码。@HoaVu-SSCCE并不意味着“上传所有代码”。这意味着创建一个展示相同问题的小型工作示例。