java - java - 如何在Java中迭代Set并向其添加元素?
问题描述
我想迭代一个 Set,如果满足某些条件,我想向它添加元素。当我这样做时,我得到“ConcurrentModificationException”。当我寻找答案时,我发现在 listIterator 的情况下,我们有 add() 和 remove() 方法,但我不能使用 list 因为我还必须处理重复项。
请提出一种方法来实现这一点。
编辑:
int[] A = {1,2,3,4,5,10,6,7,9};
Set<Integer> s = new HashSet<>();
s.add(1);
Iterator i = s.iterator();
while(i.hasNext()){
int temp = i.next();
int x = next element of array A;
if(x%2==0){
s.add(temp*x);
}
}
但它正在抛出 ConcurrentModificationException。
解决方案
java - 如何在Java中迭代Set并向其添加元素?
这是不可能的。当然,不是用HashSet
or TreeSet
。您可能需要找到一种不依赖于这样做的替代方法来编码您的算法。
正常的解决方案是创建一个临时列表,将元素添加到该列表,然后在完成迭代后使用addAll
将列表元素添加到集合中。但这在这里行不通,因为您似乎希望您的迭代器看到您添加的新元素。
第二种方法是使用 a ConcurrentHashMap
andCollections::newSetFromMap
而不是 a HashSet
。迭代并发集合不会给出ConcurrentModificationException
. 然而,另一方面是不能保证迭代器会看到迭代期间添加的所有元素。因此,对于您的示例,这可能(可靠地)不起作用。
推荐阅读
- laravel-5 - 在 Laravel 中加入多重创建?
- python - 如何在同一代码中创建两个图形?
- mysql - MYSQL JSON_SET 添加反斜杠
- laravel - nWidart/laravel-modules 在我看来如何使用 Config 关键模块
- html - 如何使用表行索引在角度表行上进行类绑定以匹配组件数组的元素
- caching - 如何让cloudlfare缓存内容但让浏览器不缓存?(所以浏览器总是在每次刷新时从 CF 获取)
- python - 如何腌制或保存 WxPython FontData 对象
- c# - JSON 无法反序列化 Xamarin 天气应用程序
- r - 创建一个矩阵,以便在打印时显示为“*”框架。R项目
- php - 如何在数据表中显示 2 张图像?