代码之家  ›  专栏  ›  技术社区  ›  weiyin

从哈希集中删除在对其进行迭代后失败

  •  3
  • weiyin  · 技术社区  · 16 年前

    在下面的示例代码中, clusters 是一个 Collection<Collection<Integer>> .

          while(clusters.size() > K){
               // determine smallest distance between clusters
               Collection<Integer> minclust1 = null;
               Collection<Integer> minclust2 = null;
               double mindist = Double.POSITIVE_INFINITY;
    
               for(Collection<Integer> cluster1 : clusters){
                    for(Collection<Integer> cluster2 : clusters){
                         if( cluster1 != cluster2 && getDistance(cluster1, cluster2) < mindist){
                              minclust1 = cluster1;
                              minclust2 = cluster2;
                              mindist = getDistance(cluster1, cluster2);
                         }
                    }
               }
    
               // merge the two clusters
               minclust1.addAll(minclust2);
               clusters.remove(minclust2);
          }
    

    clusters.remove(minclust2) 最终返回false,但我不明白为什么。

    我首先创建了10个集群来测试这段代码,每个集群都有一个1到10之间的整数。距离是介于0和1之间的随机数。下面是添加几个println语句后的输出。在集群数量之后,我打印出实际集群、合并操作和clusters.remove(minclust2)的结果。

    Clustering: 10 clusters
    [[3], [1], [10], [5], [9], [7], [2], [4], [6], [8]]
    [5] <- [6]
    true
    Clustering: 9 clusters
    [[3], [1], [10], [5, 6], [9], [7], [2], [4], [8]]
    [7] <- [8]
    true
    Clustering: 8 clusters
    [[3], [1], [10], [5, 6], [9], [7, 8], [2], [4]]
    [10] <- [9]
    true
    Clustering: 7 clusters
    [[3], [1], [10, 9], [5, 6], [7, 8], [2], [4]]
    [5, 6] <- [4]
    true
    Clustering: 6 clusters
    [[3], [1], [10, 9], [5, 6, 4], [7, 8], [2]]
    [3] <- [2]
    true
    Clustering: 5 clusters
    [[3, 2], [1], [10, 9], [5, 6, 4], [7, 8]]
    [10, 9] <- [5, 6, 4]
    false
    Clustering: 5 clusters
    [[3, 2], [1], [10, 9, 5, 6, 4], [5, 6, 4], [7, 8]]
    [10, 9, 5, 6, 4] <- [5, 6, 4]
    false
    Clustering: 5 clusters
    [[3, 2], [1], [10, 9, 5, 6, 4, 5, 6, 4], [5, 6, 4], [7, 8]]
    [10, 9, 5, 6, 4, 5, 6, 4] <- [5, 6, 4]
    false
    

    HashSet<Integer> 对于集群中的每个集群(a HashSet<HashSet<Integer>>) .

    3 回复  |  直到 16 年前
        1
  •  5
  •   Tom Hawtin - tackline    16 年前

    Set (或 Map

        2
  •  1
  •   Skip Head    16 年前

    在所示的测试中 remove 第一次尝试删除包含多个整数的集合时失败。总是这样吗?

        3
  •  0
  •   Tom Hawtin - tackline    16 年前

    clusters.remove 可能正在使用 equals 查找要删除的元素。不幸地 on collections通常比较元素是否相同,而不是相同的集合(我相信C#在这方面会做出更好的选择)。

    clusters Collections.newSetFromMap(new IdentityHashMap<Collection<Integer>, Boolean>()) (我想)。