假设我有一个列表:
List<String> list = new ArrayList<>();
list.add("a");
list.add("h");
list.add("f");
list.add("s");
在遍历这个列表的时候,我想在列表的末尾添加一个元素,但是我不想遍历新添加的元素,也就是说,我想一直迭代到列表的初始大小。
for (String s : list)
/* Here I want to add new element if needed while iterating */
有人能告诉我该怎么做吗?
7条答案
按热度按时间93ze6v8z1#
为了帮助实现这一点,我创建了一个函数,使之更容易实现。
示例
isr3a4wc2#
我们可以使用for循环在列表中迭代时存储整数值。
输出:
kx5bkwkv3#
你不能用foreach语句来做这个,foreach在内部使用了一个迭代器:
这个类的iterator和listIterator方法返回的迭代器是故障快速的:如果在迭代器创建之后的任何时候,列表的结构被修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException。
(From数组列表javadoc)
在foreach语句中,你不能访问迭代器的add方法,而且在任何情况下,这都不是你想要的add类型,因为它不会在末尾追加。你需要手动遍历列表:
请注意,这只对允许随机访问的列表有效。您可以通过检查列表是否实现了RandomAccess标记接口来检查此功能。ArrayList具有随机访问。链表没有。
gpnt7bae4#
循环访问列表的副本并向原始列表添加新元素。
参见How to make a copy of ArrayList object which is type of List?
bweufnob5#
只需迭代老式的方法,因为您需要显式的索引处理:
qyuhtwio6#
你可以迭代原始列表的副本(克隆):
注意,在列表上迭代的同时甚至不可能向列表添加新元素,因为这将导致
ConcurrentModificationException
。xwbd5t1u7#
我将元素添加到一个新的空的临时列表中,然后使用
addAll()
将临时列表添加到原始列表中,这样就避免了不必要地复制一个大的源列表。想象一下当OP的原始列表中有几百万个条目时会发生什么;一段时间内你会吸走两倍的记忆。
除了节省资源之外,这种技术还避免了我们不得不求助于80年代风格的for循环,以及使用在某些情况下可能不受欢迎的有效数组索引。