1
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

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

我还应该做什么?我应该把我的 itr.next 搬到别处吗?

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

4

5 回答 5

2

I do not know why you are getting concurrent modification exceptions, because removing items through an iterator is legitimate: according to the documentation,

If the Vector is structurally modified at any time after the Iterator is created, in any way except through the Iterator's own remove or add methods, the Iterator will throw a ConcurrentModificationException.

To answer your question about removing from the vector all elements that are equal to target, the simplest solution is to use Vector's removeAll method.

myVector.removeAll(Collections.singletonList(input));
于 2012-09-17T20:19:09.173 回答
2

AConcurrentModificationException可以在遍历集合并且不小心从中删除元素时抛出。

我建议您单独构建一个List包含要删除的元素,并Vector在循环完成执行后将它们全部从原始元素中删除。

其他建议:

您还可以遍历列表的副本。

使用 foreach 循环:

for (String value : myVector) {
  ...
}
于 2012-09-17T19:58:35.557 回答
1

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

您可能希望使用以下方法初始化 Vector:Arrays.asList(someArray)

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

像这样的东西应该工作:

String[] someArray = new String[]{ "A", "B", "C" };
Vector<String> myVector = new Vector<String>(Arrays.asList(someArray));
Iterator<String> itr = myVector.iterator();
while(itr.hasNext()){
   String myString = itr.next();
   if (myString.equals(input)) itr.remove();
}

编辑您得到异常的原因很可能是因为您错误地调用了 .next 方法。.next 方法只能在每次hasNext调用后调用一次,.remove 方法只能在每次调用后调用一次.next。由于您省略了代码中的细节,因此很难准确定位问题。但总的来说,不需要 for 循环。一个while循环应该足够了,但你不应该在if语句中使用hasNext and 。 next

使用迭代器进行迭代的正确方法是(在伪代码中):

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)
}
于 2012-09-17T19:59:31.560 回答
0

我只是避免整个迭代器。这应该做你想要的:

  while (myVector.remove(input)) {
    // this should get them all
  }
于 2012-09-17T20:07:31.930 回答
0

尝试像这样包装你的向量:

Vector vector = Collections.synchronizedCollection(vector);

和一个简短的 javadoc 解释:

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

当迭代它时,用户必须手动同步返回的集合:

Collection c =
 Collections.synchronizedCollection(myCollection);
      ...   synchronized(c) {
       Iterator i = c.iterator(); // Must be in the synchronized block
       while (i.hasNext())
          foo(i.next());   }
于 2012-09-17T20:10:17.530 回答