【发布时间】:2020-05-27 01:09:26
【问题描述】:
我已经看到了很多关于这个主题的问题,但没有一个答案真的很适合我的用例(除非我解释错了。)。是否可以在迭代器迭代时从列表中删除项目?
我想要实现的是有一个带有音频播放器的队列。迭代器在播放歌曲时遍历队列并阻塞。歌曲在播放时可以添加到队列中或从队列中删除。
我已经尝试了上述想法并收到了异常 ConcurrentModificationException 。
我还读到,在迭代器对其进行迭代时对集合进行变异是一种不好的做法。我希望有人可以为我指出正确的方向,即如何在迭代它时从方法调用中正确地改变列表。
【问题讨论】:
-
您可以使用临时列表并在迭代时仅添加所需的值,然后将此临时列表分配给原始列表
-
@Adnan 但是迭代器在到达它之前不知道是否需要该值。并且只有在请求或“音频”播放完毕时才会转到下一个/上一个。因此,在迭代器到达“标记为删除”的对象之前,它仍然在列表中。
-
我建议将其编写为自定义类,而不实现
Iterable或Iterator。将歌曲存储在 ArrayList 中,并跟踪当前播放歌曲的索引;要获得下一个,请增加该索引并在新索引处返回歌曲。添加或删除歌曲时,相应地更新索引。使用Iterable/Iterator太复杂了,因为它是知道如何更新索引的主类,而不是迭代器本身;并且您似乎不需要在同一个列表上拥有多个并发迭代器。 -
@kaya3 我已经在写a similar approach,但是感谢
AbstractList,它通过一些方法重新路由了所有方法和功能,支持整个 Collection API 并且仍然可以更新索引正确。
标签: java collections iterator concurrentmodification