在下面的代码中,我有一个try catch块,尝试使用Iterator从Vector中删除元素。我创建了自己的课程QueueExtendingVect
,扩展了Vector
并实施了Iterator
。
变量qev1
是类QueueExtendingVect
的实例。我已经为这个Vector添加了一些元素。
try
{
qev1.iterator().remove();
}
catch(UnsupportedOperationException e)
{
System.out.println("Calling Iterator.remove() and throwing exception.");
}
qev1.enqueue(ci);
qev2.enqueue(ci);
qcv1.enqueue(ci);
qcv2.enqueue(ci);
for (int i = 1; i < 5; i++)
{
if (i % 2 == 0)
{
qev1.enqueue(new CInteger(i+1));
qev2.enqueue(new CInteger(i+1));
qcv1.enqueue(new CInteger(i+1));
qcv2.enqueue(new CInteger(i+1));
}
else
{
qev1.enqueue(new Date(i*i));
qev2.enqueue(new Date(i*i));
qcv1.enqueue(new Date(i*i));
qcv2.enqueue(new Date(i*i));
}
}
在这段代码中,我向Vector qev1添加了一些元素。其他变量在代码的其他部分。
但是,当我运行程序时,我在运行时遇到IllegalStateException。我不确定这意味着什么。
答案 0 :(得分:27)
您尚未在next()
上调用Iterator
,因此它尚未引用第一项。您无法删除尚未指定的项目。
先呼叫next()
前进到第一个项目,然后拨打remove()
。
答案 1 :(得分:1)
如果您将某些内容添加到迭代器中的列表中,然后又不调用它,则再次调用该next()而是删除该项。
答案 2 :(得分:0)
@rgettman的答案是正确的,但可以给您带来想象力。
我们的收藏:| el1 | | el2 | | el3 |
当您致电iterator.next()
时,它的工作方式如下:
| el1 |迭代器| el2 | | el3 |
因此它跳过了该元素,并返回对被跳过的元素的引用(| el1 |)。因此,如果我们现在叫iterator.remove()
,| el1 |将被删除。
值得添加上面提到的@PedroBarros -在两次iterator.remove()
之间没有iterator.next()
的情况下,您无法两次调用IllegalStateException
,因为会抛出iterator1.next();
iterator1.remove();
iterator2.next();
。
同样,当您创建两个迭代器(iterator1,iterator2)时,请调用:
iterator2
将抛出ConcurrentModificationException,因为import numpy as np
import matplotlib.pyplot as plt
# plots port counts per address as a stacked bar graph
fig=plt.figure()
ax=fig.add_subplot(111)
text=ax.text(0,0, '', va='baseline', ha='left')
# plot
y=np.array([[1,2,3],[4,5,6]])
for i in range(2):
ax.plot(y[i, :], gid=i)
def on_click(event):
for curve in ax.get_lines():
if curve.contains(event)[0]: gid=curve.get_gid()
text.set_text('Class %s' % gid)
fig.canvas.mpl_connect('button_press_event', on_click)
检查集合是否已修改。