我有一个问题,我试图迭代存储餐馆对象的arraylist但循环只通过五个元素中的3个.
我创建了一个测试方法来说明:
public void testLoop() {
ArrayList<Eatery> test = new ArrayList<Eatery>();
test = eateriesListDefault;
for(Eatery e : test) {
MyLog.e(TAG, "Name: " + e.getName());
}
for (int i = 0; i < eateriesListDefault.size(); i++) {
MyLog.e(TAG, "Name " + test.get(i).getName());
test.remove(i);
}
for(Eatery e : test) {
MyLog.e(TAG, "Name " + e.getName());
}
}
Run Code Online (Sandbox Code Playgroud)
这里测试将有5个餐馆对象.第一个循环成功打印5个名称中的5个.第二个循环只删除了3个餐馆,因此最后一个循环打印出两个名字.
我试过用
for(Eatery e : eateriesListDefault) {
MyLog.e(TAG, "Name: " + e.getName());
test.remove(e);
}
Run Code Online (Sandbox Code Playgroud)
代替第二个循环,但是我得到并发访问错误.
有谁知道我做错了什么?
你eateriesListDefault.size()在每次循环迭代中调用.与此同时,您正在调用test.remove(i)每次迭代将数组缩短一次.你的循环基本上是这样做的:
i = 0 size = 5继续
i = 1 size = 4继续
i = 2 size = 3继续
i = 3尺寸= 2停止
如果你的目标是打印出数组的第一个元素然后删除它,你可能会通过这个循环到达那里:
while(!eateriesListDefault.isEmpty()) {
MyLog.e(TAG, "Name " + test.get(0).getName());
test.remove(0);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1097 次 |
| 最近记录: |