English 中文(简体)
删除从HashSet失败后遍历
原标题:
  • 时间:2009-04-15 23:56:24
  •  标签:

我编写一个凝结的聚类算法在java和难以移除操作。它似乎总是失败当集群的数量达到初始数量的一半。

在下面的示例代码中,集群<代码> < /代码>是<代码>收集收集< <整数> > > < /代码。

      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

(10、9、5、6、4、5、6、4,……设置只是变得无限。

<强>编辑:澄清,我使用一个<代码> HashSet <整数> < /代码>每个集群的集群(<代码> HashSet < HashSet <整数> >)< /代码>。< /强>

最佳回答

啊。当你改变一个值,已经在<代码>设置> < /代码(或<代码> < /代码>映射键),那么这未必是在正确的位置和哈希码将被缓存。你需要删除它,改变它,然后重新插入。

问题回答

所示的测试中,<代码>删除> < /代码失败你第一次尝试删除一个集合包含不止一个整数。这是总是这样吗?

使用集合的具体类型是什么?

有明显的问题是,<代码>集群。删除> < /代码可能是使用<代码> = > < /代码找到删除元素。不幸的是<代码> = > < /代码集合通常比较是否元素是相同的,而不是如果是相同的集合(我相信c#使一个更好的选择在这方面)。

一个简单的方法是创建集群<代码> < /代码>,<代码>集合。newSetFromMap(新IdentityHashMap < <整数>集合,布尔>())> < /代码(我认为)。





相关问题
热门标签