删除Arraylist中的特定项目

时间:2015-12-28 18:51:06

标签: java

我正在努力从我的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)){
 //所有与爆发火山同一牢房的人死亡
 }
 }
}
  



3 个答案:

答案 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。我假设你有一个单独的线程在运行,这是用于学校作业或类似的东西。如果你在现实世界中这样做,你必须考虑到这两个列表(人和火山)可能随时都在变化的事实。