【发布时间】:2012-03-05 07:40:43
【问题描述】:
我有一个集合 A = {(1,2), (1,2,3), (2,3,4), (3,4), (1)}
我想把它变成 A={(1,2,3), (2,3,4)},从这个集合中删除适当的子集。
我使用 HashSet 实现集合,使用 2 个迭代器遍历集合并使用 containsAll(c) 检查所有对的正确子集条件,并使用 remove() 方法删除正确子集。
代码如下所示:
HashSet<Integer> hs....
Set<Integer> c=hs.values();
Iterator<Integer> it= c.iterator();
while(it.hasNext())
{
p=it.next();
Iterator<Integer> it2= c.iterator();
while(it2.hasNext())
{
q=it2.next();
if q is a subset of p
it2.remove();
else if p is a subset of q
{
it.remove();
break;
}
}
}
我第一次退出内部 while 循环并执行一次时遇到 ConcurrentModificationException
p=it.next();
例外情况是在迭代集合时修改集合。但这就是 .remove() 的用途。
我在只使用 1 个迭代器时使用了 remove() 并且没有遇到任何问题。
如果异常是因为我在迭代它时从 'c' 或 'hs' 中删除了一个元素,那么当它遇到下一个它时应该抛出异常 2 .next () 命令,但我没有看到它。当它遇到 it.next() 命令时我看到了。
我使用了调试器,在元素被移除后,集合和迭代器的顺序非常完美。它们包含并指向正确的更新集和元素。 it.next() 包含要分析的下一个元素,它不是已删除的元素。
关于如何在不复制哈希集本身并在提交更新之前将其用作中间体的情况下如何做我想做的事情的任何想法?
谢谢
【问题讨论】: