Java 从哈希集中删除在对其进行迭代后失败
我正在用java编写一个聚合聚类算法,但在删除操作方面遇到了问题。当集群数量达到初始数量的一半时,它似乎总是失败 在下面的示例代码中,Java 从哈希集中删除在对其进行迭代后失败,java,collections,hash,iterator,hashset,Java,Collections,Hash,Iterator,Hashset,我正在用java编写一个聚合聚类算法,但在删除操作方面遇到了问题。当集群数量达到初始数量的一半时,它似乎总是失败 在下面的示例代码中,集群是一个集合 [10,9,5,6,4,5,6,4,…]集合从那里无限增长 Edit:为了澄清这一点,我对集群中的每个集群使用了一个HashSet(一个HashSet)存在的明显问题是集群。remove可能是使用equals来查找要删除的元素。不幸的是,equalson collection通常比较元素是否相同,而不是相同的集合(我认为C#在这方面做得更好) 一个
集群
是一个集合
[10,9,5,6,4,5,6,4,…]集合从那里无限增长
Edit:为了澄清这一点,我对集群中的每个集群使用了一个
HashSet
(一个HashSet)
存在的明显问题是集群。remove
可能是使用equals
来查找要删除的元素。不幸的是,equals
on collection通常比较元素是否相同,而不是相同的集合(我认为C#在这方面做得更好)
一个简单的解决方法是将
集群创建为集合。newSetFromMap(new IdentityHashMap())
(我认为)。在所示的测试中,第一次尝试删除包含多个整数的集合时,删除
失败。总是这样吗
使用的集合的具体类型是什么?啊。当您更改已在集合
(或映射
键)中的值时,它不一定位于正确的位置,哈希代码将被缓存。您需要删除它,更改它,然后重新插入它。[10,9,5,6,4,5,6,4,…]显然不是一个集合。这是一份清单吗?是的,很好。哈希集不能包含重复的对象。这里有些奇怪。关于equals的观点很好,但即使它使用equals,为什么删除操作会失败呢?是的,你的思路是正确的。第一次尝试删除包含多个整数的集合时,它总是失败。我为集群中的每个集群使用一个HashSet(HashSet),这很奇怪。如果您使用的是HashSet,为什么会在集合中获得多个值。正如我前面所说的,HashSet不应该包含重复的对象。我认为这里有一个更深层次的问题。显然是为了维持秩序。是的,你明白了!解决方案是创建一个新集群,添加minclust1和minclust2中的所有元素,从集群中删除minclust1和minclust2,然后添加新集群。在HashSet中改变对象似乎不是个好主意。太好了。不变性岩石。从技术上讲,只要不打乱元素的equals和hashCode,就可以将元素更改为HashSet,但这取决于所有数据或任何数据。如果您有HashSet,您就可以毫不畏惧地修改组件。
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);
}
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