我正在努力从我的arraylist中删除项目。更具体地说,我有两个arraylists,人和vulcanos。两者都位于网格中。每个时间步,人们可以移动或不移动(这种情况随机发生在对象上),而火山在整个模拟过程中是静态的。火山爆发与否。这由用户定义的概率确定。当在某个时间步骤中,一个人与喷发的火山位于同一个细胞时,这个人就会死亡。但我不知道如何从我的阵列中删除那个特定的人。到目前为止,我得到了以下内容(每个时间步都重复)。


 for(int j = 0; j< persons.size(); j ++){
 for(int k = 0; k< volcanos.size(); k ++){
 if((persons.get(j).getXCoordPerson())==(volcanos.get(k).getXCoordVolcano())
&&(persons.get(j).getYCoordPerson())== (volcanos.get(k).getYCoordVolcano())
&&(volcanos.get(k).getEruptionStatus()== true)){
 //所有与爆发火山同一牢房的人死亡
 }
 }
}
 代码>


答案 0 :(得分:1)
尝试将您的人员标记为死亡或受伤(等)或将其添加到其他列表中。然后在循环后删除它们
persons.removeAll(deadPeople);
答案 1 :(得分:1)
如果您不介意使用Iterable
代替List
,如果您不介意依赖Guava,那么为什么不使用Iterables
?
Iterable<Person> filtered = Iterables.filter(persons, new Predicate<Person>() {
@Override
public boolean apply(Person person) {
for (Volcano v : volcanos) {
if (v.getEruptionStatus() &&
v.getXCoordVolcano() == person.getXCoordPerson() &&
v.getYCoordVolcano() == person.getYCoordPerson()) {
return false;
}
}
return true;
}
});
这将过滤掉所有死亡的Persons
,并将filtered
仅留给活着的人
答案 2 :(得分:1)
您也可以使用Iterator
执行此操作:
for(Iterator<Person> personIterator = persons.iterator(); i.hasNext(); ) {
Person person = personIterator.next();
for(Volcano volcano : volcanos) {
if(volcano.getEruptionStatus() &&
volcano.getYCoordVolcano() == person.getYCoordPerson() &&
volcano.getXCoordVolcano() == person.getXCoordPerson()) {
personIterator.remove();
}
}
}
在这种情况下,您使用迭代器进行删除,将ArrayList
置于您想要的状态作为循环的副作用。
需要注意的一件事是,您不会在此循环期间修改人员列表,或者最终会得到ConcurrentModificationException
。我假设你有一个单独的线程在运行,这是用于学校作业或类似的东西。如果你在现实世界中这样做,你必须考虑到这两个列表(人和火山)可能随时都在变化的事实。