当前位置: 首页 > 面试题库 >

重复执行时从HashSet中删除元素

宗政子辰
2023-03-14
问题内容

因此,如果我尝试在迭代时从Java HashSet中 删除元素,则会收到 ConcurrentModificationException
。如下例所示,从 HashSet中 删除元素子集的最佳方法是什么?

Set<Integer> set = new HashSet<Integer>();

for(int i = 0; i < 10; i++)
    set.add(i);

// Throws ConcurrentModificationException
for(Integer element : set)
    if(element % 2 == 0)
        set.remove(element);

这是一个解决方案,但我认为它不是很优雅:

Set<Integer> set = new HashSet<Integer>();
Collection<Integer> removeCandidates = new LinkedList<Integer>();

for(int i = 0; i < 10; i++)
    set.add(i);

for(Integer element : set)
    if(element % 2 == 0)
        removeCandidates.add(element);

set.removeAll(removeCandidates);

谢谢!


问题答案:

您可以手动遍历集合的元素:

Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()) {
    Integer element = iterator.next();
    if (element % 2 == 0) {
        iterator.remove();
    }
}

您通常会使用for循环而不是while循环来查看此模式:

for (Iterator<Integer> i = set.iterator(); i.hasNext();) {
    Integer element = i.next();
    if (element % 2 == 0) {
        i.remove();
    }
}

正如人们指出的那样,使用for循环是优选的,因为这样可以将迭代器变量(i在这种情况下)限制在较小的范围内。



 类似资料:
  • 我有一个问题: 对象显示给定一个排序数组,删除重复的元素,使每个元素只出现一次,并返回新的长度。不要为另一个数组分配额外的空间,必须在内存不变的情况下这样做。例如,给定输入数组Nums=[1,1,2],你的函数应该返回长度=2,Nums的前两个元素分别为1和2。你在新的长度之外留下什么并不重要。 我使用HashSet来回答这个问题,但结果总是显示[1,1]。我想不出来有人能帮我知道问题出在哪里吗?

  • 问题内容: 我的数据库中有一个表,其中有要删除的重复记录。我不想为此创建具有不同条目的新表。我想要的是从现有表中删除重复的条目,而无需创建任何新表。有什么办法吗? 看到这些都是我的字段: id对于每一行都是唯一的。 L11_data对于相应的动作字段是唯一的。 L11_data具有公司名称,而动作具有行业名称。 因此,在我的数据中,我在L11_data中有各自行业的重复公司名称。 我要拥有的是存储

  • 我试图编辑我的deletar()方法,把一个迭代器移除元素,但没有工作,错误继续。

  • 问题内容: 如何从ArrayList中删除重复的元素? 问题答案: 如果你不想在中添加重复项,则应考虑为什么要使用允许重复项的。删除重复元素的最简单方法是将内容添加到中(不允许重复),然后将其添加Set回中ArrayList: 当然,这会破坏中的元素顺序。

  • 我使用下面的代码来显示数组中的类别。数组可能包含重复的类别。有什么办法我只能选择独特的元素在VUEJS? 数组:

  • 问题内容: 我在PostgreSQL 8.3.8数据库中有一个表,该表上没有键/约束,并且有多个行,它们的值完全相同。 我想删除所有重复项,并且每行仅保留1个副本。 特别是有一列(称为“密钥”)可用于标识重复项,即,每个不同的“密钥”应该只存在一个条目。 我怎样才能做到这一点?(理想情况下,使用单个SQL命令。) 在这种情况下,速度不是问题(只有几行)。 问题答案: