Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从哈希集中删除在对其进行迭代后失败_Java_Collections_Hash_Iterator_Hashset - Fatal编程技术网

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#在这方面做得更好) 一个

我正在用java编写一个聚合聚类算法,但在删除操作方面遇到了问题。当集群数量达到初始数量的一半时,它似乎总是失败

在下面的示例代码中,
集群
是一个
集合


[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