Java没有从列表中删除特定项目



我目前正在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);
}
}

最新更新