Java不从列表中删除特定项

yzxexxkh  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(94)

我目前正在Minecraft Spot开发一个插件。我不相信这是一个龙头的问题,虽然,我相信这是一个Java的问题。在我的类中有一个名为setInjury()的方法,它应该复制一个列表,从副本中删除一个项目,并将列表替换为新的列表。奇怪的是,这还管用。但对于一个项目,它只是拒绝删除它。它会删除其他的,但不是这一个。我检查了弹壳和所有东西。甚至boolean 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
jtw3ybtb

jtw3ybtb1#

很难遵循你的确切逻辑(因为你没有给予我们一个完整的方法,例如不清楚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();
}
xv8emn3q

xv8emn3q2#

为了避免不可预测的行为,甚至是潜在的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);
        }
}

相关问题