【问题标题】:Is there any data structure that has no duplicates but can have elements added to it while being iterated over?是否有任何数据结构没有重复但可以在迭代时添加元素?
【发布时间】:2020-05-30 03:28:00
【问题描述】:

我知道集合没有重复项,但问题是我无法在使用迭代器或针对每个循环对其进行迭代时向其中添加元素。还有其他方法吗?谢谢。

【问题讨论】:

标签: java data-structures iterator set


【解决方案1】:

ConcurrentHashMap 类可用于此目的。例如:

Set<T> set = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());

(您可以将&lt;T, Boolean&gt; 替换为&lt;&gt; 并让编译器推断类型。出于说明目的,我按上述方式编写。)

Collections::newSetFromMapjavadoc 说:

返回由指定映射支持的集合。结果集显示与支持映射相同的排序、并发性和性能特征。本质上,这个工厂方法提供了一个Set 实现,对应于任何Map 实现。

由于ConcurrentHashMap 允许同时迭代和更新,所以上面生成的Set 也是如此。问题是迭代可能看不到在迭代时添加或删除的效果。

迭代的并发属性可以从javadoc 中推断出ConcurrentHashMap


还有没有其他办法。

这取决于您的要求,但有一些潜在的方法可以避免该问题。例如,您可以:

  1. 在迭代之前复制集合,或者
  2. 将新元素添加到另一个新集合中,并将现有元素添加到新集合中……之后或在……迭代时添加到新集合中。

但是,如果没有并发瓶颈(例如 1.)或行为差异(例如 2.),这些都不太可能工作

【讨论】:

    【解决方案2】:

    不确定以下方法是否能解决您的问题,但您可以尝试:

        HashSet<Integer> original = new HashSet<>();
        HashSet<Integer> elementsToAdd = new HashSet<>();
        elementsToAdd.add(element); //while iterating original
        original.addAll(elementsToAdd); //Once done with iterating, just add all.
    

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 2020-04-22
      • 1970-01-01
      • 2016-12-25
      相关资源
      最近更新 更多