参考成员在arraylist.forEach中被修改?

时间:2015-01-18 02:13:28

标签: java arraylist

我正在创建一个生存模拟器,我有arrayListEntity个。我正在编写一个checkForDead()方法,如果该成员已经死亡,它将删除该成员。现在,我有一个很长的for声明来做这件事。但是,我想使用arrayList.forEach()以使其更具可读性。如上所述,部分操作必须删除它。如何在forEach()方法中引用要修改的内容?例如

a.forEach(a.remove(x));

其中a是列表,x是要修改的成员。我怎样才能得到x的内容?

checkForDead方法中的原始代码:

for (int x = 0; x < a.size(); x++) {

            if (a.get(x).calories <= 0) {
                Fates.addDeathRecord(a.get(x).name, x, "starved to death");
                a.remove(x);
            }

            else if (a.get(x).hydration <= 0) {
                Fates.addDeathRecord(a.get(x).name, x, "died of thirst");
                a.remove(x);
            }

            else if (a.get(x).heat <= 0) {
                Fates.addDeathRecord(a.get(x).name, x, "froze to death");
                a.remove(x);
            }

            else if (a.get(x).heat >= 14) {
                Fates.addDeathRecord(a.get(x).name, x, "overheated");
                a.remove(x);
            }

            else if (a.get(x).moral <= Chance.randomNumber(0, 2)) {
                Fates.addDeathRecord(a.get(x).name, x, "commited suicide");
                a.remove(x);
            }

        }

    }

3 个答案:

答案 0 :(得分:1)

forEach方法可能不适合从结构上修改正在迭代的集合。如javadoc中所述:

  

默认实现的行为如下:

 for (T t : this)
     action.accept(t);

根据您使用的List实现,通过添加或删除操作集合可能会导致ConcurrentModificationException。在这种情况下,使用传统的Iteratorremove可能仍然是最佳解决方案。

//keep track of index for death record
int x = 0;
for (Iterator<Entry> iter = a.iterator(); iter.hasNext(); ++x) {

        final Entry next = iter.next();
        if (next.calories <= 0) {
            Fates.addDeathRecord(next.name, x, "starved to death");
            iter.remove();
        }

        else if (next.hydration <= 0) {
            Fates.addDeathRecord(next.name, x, "died of thirst");
            iter.remove();
        }

        else if (next.heat <= 0) {
            Fates.addDeathRecord(next.name, x, "froze to death");
            iter.remove();
        }

        else if (next.heat >= 14) {
            Fates.addDeathRecord(next.name, x, "overheated");
            iter.remove();
        }

        else if (next.moral <= Chance.randomNumber(0, 2)) {
            Fates.addDeathRecord(next.name, x, "commited suicide");
            iter.remove();
        }

}

答案 1 :(得分:1)

我相信你可以使用如下的lambda表达式。

a.foreach(element -> {
    // access element
    System.out.println(element.name);
    // do other stuff
});

您可能需要查看removeIf()-method,它会删除符合条件的所有元素。

答案 2 :(得分:0)

List<Entity> toRemove = new ArrayList<Entitys>();
for (int i=0; i<a.size(); i++){
    if (a.get(i).checkForDead()){
         toRemove.add(a.get(i));
         a.remove(i);
}
for (int i=0; i<toRemove.size(); i++){
    ..your code..
}