使用Java创建异常时遇到迭代器问题 从键盘输入字符串 向量myVector=新向量(someArray.length)//假设向量已填充 迭代器itr=myVector.Iterator(); for循环开始 while(itr.hasNext()&&itr.next().equals(输入)){ itr.remove(); } ... while(itr.hasNext()//这是问题的根源吗? 运行更多代码 用于循环结束

使用Java创建异常时遇到迭代器问题 从键盘输入字符串 向量myVector=新向量(someArray.length)//假设向量已填充 迭代器itr=myVector.Iterator(); for循环开始 while(itr.hasNext()&&itr.next().equals(输入)){ itr.remove(); } ... while(itr.hasNext()//这是问题的根源吗? 运行更多代码 用于循环结束,java,concurrency,java.util.concurrent,Java,Concurrency,Java.util.concurrent,当当前元素等于字符串input时,我想删除该元素,否则继续迭代。我在这里不断得到并发异常 我还应该做什么?我应该把我的itr移到别的地方吗 问题:我想要这样的逻辑:如果当前向量元素等于target,我希望将其从向量中删除。我如何才能做到这一点?在遍历集合时,可以抛出ConcurrentModificationException 我建议您构建一个单独的列表,以包含要删除的元素,并在循环完成后将它们从原始向量中删除 其他建议: 您还可以迭代列表的副本 使用foreach循环: String inpu

当当前元素等于字符串
input
时,我想删除该元素,否则继续迭代。我在这里不断得到并发异常

我还应该做什么?我应该把我的itr移到别的地方吗


问题:我想要这样的逻辑:如果当前向量元素等于target,我希望将其从向量中删除。我如何才能做到这一点?

在遍历集合时,可以抛出
ConcurrentModificationException

我建议您构建一个单独的
列表
,以包含要删除的元素,并在循环完成后将它们从原始
向量
中删除

其他建议:

您还可以迭代列表的副本

使用foreach循环:

String input from keyboard
Vector<String> myVector = new Vector<String>(someArray.length);   //assume Vector is populated
Iterator<String> itr = myVector.iterator();

for loop begins
    while(itr.hasNext() && itr.next().equals(input)){
       itr.remove();
    }

    ...

    while(itr.hasNext()    // is this the problem source?
     run more code  

for loop ends

当迭代集合而不小心从集合中删除元素时,可能会抛出
ConcurrentModificationException

我建议您构建一个单独的
列表
,以包含要删除的元素,并在循环完成后将它们从原始
向量
中删除

其他建议:

您还可以迭代列表的副本

使用foreach循环:

String input from keyboard
Vector<String> myVector = new Vector<String>(someArray.length);   //assume Vector is populated
Iterator<String> itr = myVector.iterator();

for loop begins
    while(itr.hasNext() && itr.next().equals(input)){
       itr.remove();
    }

    ...

    while(itr.hasNext()    // is this the problem source?
     run more code  

for loop ends

你初始化向量的内容了吗?你正在构造函数中设置它的长度,但我看不出你实际上是在向它添加字符串,这将导致NullPointerException

您可能希望使用以下命令初始化向量:Arrays.asList(someArray)

当拥有正确的向量时,不需要在for循环中为迭代器设置while循环

像这样的方法应该会奏效:

for (String value : myVector) {
  ...
}

你初始化向量的内容了吗?你正在构造函数中设置它的长度,但我看不出你实际上是在向它添加字符串,这将导致NullPointerException

您可能希望使用以下命令初始化向量:Arrays.asList(someArray)

当拥有正确的向量时,不需要在for循环中为迭代器设置while循环

像这样的方法应该会奏效:

for (String value : myVector) {
  ...
}

我只想避开整个迭代器。 这应该满足您的要求:

while (iterator has more items) {
    get the next item
    do something with the item (remove it if it should be removed, or handle it in another way)
}

我只想避开整个迭代器。 这应该满足您的要求:

while (iterator has more items) {
    get the next item
    do something with the item (remove it if it should be removed, or handle it in another way)
}

尝试如下方式包装向量:

  while (myVector.remove(input)) {
    // this should get them all
  }
还有一个简短的javadoc解释:

返回由支持的同步(线程安全)集合 指定的集合。为了保证串行访问,它是 完成对备份集合的所有访问至关重要 通过返回的集合

用户必须手动同步返回的数据 在集合上迭代时:


尝试如下方式包装向量:

  while (myVector.remove(input)) {
    // this should get them all
  }
还有一个简短的javadoc解释:

返回由支持的同步(线程安全)集合 指定的集合。为了保证串行访问,它是 完成对备份集合的所有访问至关重要 通过返回的集合

用户必须手动同步返回的数据 在集合上迭代时:


我不知道为什么会出现并发修改异常,因为通过迭代器删除项是合法的:根据文档

如果在迭代器创建后的任何时间以任何方式修改向量的结构,除了通过迭代器自己的remove或add方法,迭代器将抛出一个
ConcurrentModificationException

要回答您关于从向量中删除所有等于目标的元素的问题,最简单的解决方案是使用
vector
的方法


我不知道为什么会出现并发修改异常,因为通过迭代器删除项是合法的:根据文档

如果在迭代器创建后的任何时间以任何方式修改向量的结构,除了通过迭代器自己的remove或add方法,迭代器将抛出一个
ConcurrentModificationException

要回答您关于从向量中删除所有等于目标的元素的问题,最简单的解决方案是使用
vector
的方法


向量是否与其他线程共享?循环中是否有代码修改了你忽略的向量内容?你能否通过异常的完整堆栈跟踪?正如你在上一个问题中所说的,你的迭代器没有做任何有用的事情。你不需要它,把它取出来。你不是在使用someArray.length填充向量,是吗只需设置它的容量。您最好向我们展示使用
itr
的全部代码,因为您忽略的问题可能是向量是否与其他线程共享?是否有代码修改您忽略的循环中向量的内容?您是否可以通过异常的完整堆栈跟踪?例如EA在前面的问题中说,你的迭代器没有做任何有用的事情。你不需要它,把它拿出来。你没有使用someArray.length填充向量,你只是在设置它的容量。你最好向我们展示使用
itr
的全部代码,因为你可能忽略的是问题严格来说这不是真的-使用迭代器并通过(并且仅通过)
iterator.remove()
从迭代器中删除元素是完全合法的