【问题标题】:How to iterate over Set and add elements to it in java?java - 如何在Java中迭代Set并向其添加元素?
【发布时间】:2019-07-06 14:00:43
【问题描述】:

我想迭代一个 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。

【问题讨论】:

  • 帮助我们帮助你 - 请分享一个样本集,以及你想要得到的结果。
  • 将创建的对象添加到另一个集合中,当循环完成后,将新集合的所有元素添加到集合中?
  • 我多次添加元素,所以不能每次都创建新对象。
  • HashSet 没有排序。因此,即使允许这样做,您也无法确定迭代器是否会返回您刚刚添加的元素。使用列表,在将新元素添加到列表之前,检查它是否已经存在于集合中。如果没有,则将该元素添加到列表和集合中。当然,除非数组太短以至于使用集合是多余的,并且您可以检查列表是否已经包含该元素。
  • 但是每次检查元素是否已经存在于列表中需要额外的时间。

标签: java iterator set


【解决方案1】:

如何在 Java 中迭代 Set 并向其添加元素?

这是不可能的。当然,不是HashSetTreeSet。您可能需要找到一种替代方法来编码您的算法,而不依赖于这样做。

通常的解决方案是创建一个临时列表,将元素添加到该列表中,然后在完成迭代后使用addAll 将列表元素添加到集合中。但这在这里行不通,因为您似乎希望迭代器看到您添加的新元素。

第二种方法是使用ConcurrentHashMapCollections::newSetFromMap 而不是HashSet。迭代并发集合不会给出ConcurrentModificationException。然而,另一方面是不能保证迭代器会看到迭代期间添加的所有元素。因此,对于您的示例,这可能(可靠地)不起作用。

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 2011-12-23
    • 2015-02-07
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    相关资源
    最近更新 更多