我目前正在minecraft插口中开发一个插件。不过,我不认为这是一个插口问题,我认为这是java问题。我的类中有一个名为setApriry((的方法,它应该制作列表的副本,从副本中删除一个项,并用新的列表替换列表。奇怪的是,这很管用。但是,对于一个项目,它只是拒绝删除它。它会删除其他项目,但不会删除这个项目。我检查了套管和所有东西。即使是from.remove中的布尔值也表示它已被删除,但实际上并没有。
(iStore是一个文件配置文件,而store是我的类,它在中(
它曾经在if-else语句中,但remove中的布尔值仍然有效。这一切最奇怪的是它昨天真的起作用了。
List<String> sevs = iStore.getStringList(uuid + "." + section);
for(String s : iStore.getStringList(uuid + "." + section)) {
boolean isFracture = s.equals("Fracture") && injury.equals("Broken") ;
if(s.equals(injury)) {
continue;
}
sevs.add("Broken");
sevs.remove(isFracture ? "Fracture" : "Intact");
iStore.set(uuid + "." + section, sevs);
store.saveStore();
}
我的另一个更混乱的代码也做了同样的事情,以证明它应该删除它:
List<String> sevs = iStore.getStringList(uuid + "." + section);
for(String s : iStore.getStringList(uuid + "." + section)) {
if(sevs.contains(injury)) {
return;
}else if(injury.equals("Broken") && s.equals("Fracture")){
sevs.add("Broken");
sevs.remove("Fracture");
Bukkit.getLogger().info(Boolean.toString(sevs.remove("Fracture"))); //returns true??
iStore.set(uuid + "." + section, sevs);
store.saveStore();
}else{
sevs.add(injury);
sevs.remove("Intact");
iStore.set(uuid + "." + section, sevs);
store.saveStore();
}
运行代码前列表:
rlegstat:
- Cured
- Fracture
//Desired result if injury is equal to broken:
rlegstat:
- Cured
- Broken
//Actual results
rlegstat:
- Cured
- Fracture
- Broken
很难遵循您的确切逻辑(因为您没有给我们一个完整的方法,例如,不清楚injury
来自哪里(,但似乎根本不需要循环。简单地使用.contains()
、.add()
和.remove()
就足够了:
private addInjury(String section, String injury) {
String storeKey = uuid + "." + section;
List<String> sevs = iStore.getStringList(storeKey);
if (injury.equals("Broken")) {
sevs.remove("Fracture"); // no need to check if it's in sev, if it isn't this will do nothing.
} else {
sevs.remove("Intact"); // depending on the desired logic, this could just go after the if outside of the else block.
}
if (!sevs.contains(injury)) {
sevs.add(injury);
}
iStore.set(storeKey, sevs);
store.saveStore();
}
为了避免不可预测的行为,甚至避免潜在的ConcurrentModificationException,不要使用增强的for循环,而是使用Iterator,它支持在迭代时删除元素。
或者,您可以使用简单的for循环并向后迭代:
List<String> list;
for(int i = list.size() - 1; i >= 0; --i) {
if(list.get(i).contains("bad")){
list.remove(i);
}
}