我正在创建一个生存模拟器,我有arrayList
个Entity
个。我正在编写一个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);
}
}
}
答案 0 :(得分:1)
forEach方法可能不适合从结构上修改正在迭代的集合。如javadoc中所述:
默认实现的行为如下:
for (T t : this) action.accept(t);
根据您使用的List
实现,通过添加或删除操作集合可能会导致ConcurrentModificationException。在这种情况下,使用传统的Iterator
和remove可能仍然是最佳解决方案。
//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..
}