-1

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

/* 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 --;      
}
4

1 回答 1

3

您没有包含足够的代码来让我们正确诊断问题,所以这是一个一般性的答案。

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

这是“不可能发生”。如果密钥被删除,它将不在密钥集中。此外,由于键是(看起来)对象,我们几乎可以排除andString存在问题的可能性。equalshashcode

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

  • 两个上下文中的groups对象是不同的。
  • 在删除和检查密钥集之间,有些东西正在添加一个或多个密钥。(例如,mergerdGroup.name实际上等于candidate1candidate2。)
  • 键实际上并不相同……它们只是看起来相同。
于 2013-09-18T04:34:13.097 回答