for (int cell: locations){ // locations is a ArrayList of integers
if (guess == cell) {
result = "hit";
//locations.set(cell, null);
numOfHits++;
break;
}
}
我的问题是用计算机玩扫雷并且在循环中我正在检查每个目标位置,所以在我检查其中一个之后我想再不再检查一次!! 我试图删除但是ArrayList elemet等于单元格但是当输入再次是相同的索引时它会带来错误。我试图将已选中的一个设置为null,但它也有错误!
答案 0 :(得分:1)
最好不要尝试手动修改ArrayList
的内容
在ArrayList<Integer>
上将特定索引设置为null时,您实际上并未删除该元素。您将该元素保留在原位,但值为null
:
ArrayList<Integer> locations = new ArrayList<>();
locations.add(1);
locations.add(2);
System.out.println(locations); // [1, 2]
locations.set(0, null);
System.out.println(locations); // [null, 2]
当您稍后尝试访问设置为null
的索引时,当您尝试将NullPointerException
取消装入null
时,您可能会获得int
}:
int i = locations.get(0); // throws NPE trying to convert null to int
使用Iterator
代替使用for-each循环,它可以在遍历数据结构时安全地修改数据结构的内容:
Iterator<Integer> itr = locations.iterator();
while (itr.hasNext()) {
int cell = itr.next();
if (guess == cell) {
result = "hit";
itr.remove();
numOfHits++;
break;
}
}
答案 1 :(得分:0)
您可以从ArrayList中删除该元素。但请注意,它会减少以下所有元素的索引(即前一个(第i + 1)个元素将成为新的第i个元素),因此您必须将循环索引递减到帐户为了那个原因。实际上,如果你在删除项目后从循环中断开,那么如果你递减索引并不重要。
for (int i=0; i<locations.size();i++){
int cell = locations.get(i);
if (guess == cell) {
result = "hit";
locations.remove(i);
i--; // this only matters if you continue iterating over the list
numOfHits++;
break;
}
}