我的目标是迭代一个对象列表,并具有两个功能: - 能够在迭代期间从列表中删除。 - 能够访问我正在迭代的对象的公共get方法,以便能够确定是否应该删除它们。
例如,我如何才能使以下工作?目前它提供例外java.util.ArrayList$Itr cannot be cast to random.folder.dir.TestClass
。
public class TestClass {
public int foo;
public TestClass(int foo) {
this.foo = foo;
}
public int getFoo() {
return foo;
}
}
List<TestClass> testList = new ArrayList<TestClass>();
testList.add(new TestClass(1));
testList.add(new TestClass(2));
testList.add(new TestClass(3));
Iterator<TestClass> it = tickScratch.iterator();
while(it.hasNext()) {
if(((TestClass)it).getFoo() == 2)
it.remove();
}
答案 0 :(得分:2)
it
是ListIterator<TestClass>
个实例,因此它没有getFoo()
方法。
您应该使用next()
来获取下一个元素,然后在需要时将其删除:
while (it.hasNext() {
TestClass current = it.next();
if (current.getFoo() == 2)
it.remove();
}
答案 1 :(得分:1)
需要改变
if(((TestClass)it).getFoo() == 2)
到
if(it.getNext().getFoo() == 2)
答案 2 :(得分:0)
您的代码存在问题:
Iterator<TestClass> it = tickScratch.iterator();
while(it.hasNext()) {
if(((TestClass)it).getFoo() == 2)
it.remove();
}
it
是Iterator<TestClass>
而不是TestClass
,因此您收到的错误为$Itr cannot be cast to random.folder.dir.TestClass
。你正在做的事情类似于将ArrayList<String>
投射到String
,你有一堆TestClass
个对象,而不只是一个。
使用这样的迭代器:
Iterator<TestClass> it = tickScratch.iterator();
while(it.hasNext()) {
if(it.next().getFoo() == 2)
it.remove();
}
答案 3 :(得分:0)
next ()
函数返回迭代器'指向'的对象。根据需要使用它。
http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html#next()