Java 循环的Vector.remove()
我正在编写一个游戏,几乎完成了保存文件系统。我有两个向量(一个持有savegame的名称,一个持有sessionID) 在启动时,程序将从文件中读取数据,并将该信息添加到向量中。然后调用另一个方法来检查向量中显示的文件是否确实存在。如果没有,它们将从向量中删除。最后,将矢量打印到文件并重写文件 我遇到的问题是for循环没有检查向量中的每一项,因为移除项时,Vector.size()会减少。是否有更好的方法来形成for循环,或者有什么解决方法可以使用Java 循环的Vector.remove(),java,file,for-loop,vector,Java,File,For Loop,Vector,我正在编写一个游戏,几乎完成了保存文件系统。我有两个向量(一个持有savegame的名称,一个持有sessionID) 在启动时,程序将从文件中读取数据,并将该信息添加到向量中。然后调用另一个方法来检查向量中显示的文件是否确实存在。如果没有,它们将从向量中删除。最后,将矢量打印到文件并重写文件 我遇到的问题是for循环没有检查向量中的每一项,因为移除项时,Vector.size()会减少。是否有更好的方法来形成for循环,或者有什么解决方法可以使用 private static void sli
private static void slistCleanup() throws IOException {
private static Vector<String> saveNames = new Vector<String>();
private static Vector<Integer> sessionIDs = new Vector<Integer>();
Scanner slistReader = new Scanner(new FileReader(sessionList));
File tempSave;
String path;
int run = 1;
String tempName = " ";
int tempID = 0;
for (int x = 0; x < saveNames.size(); x++) {
path = currentDir + "\\saves\\" + sessionIDs.elementAt(x) + ".sav";
tempSave = new File(path);
System.out.println("-----------------------"); //debug
System.out.println("current pass: " + run);
System.out.println("tempSave Path: " + tempSave.getAbsolutePath()); //debug
System.out.println("tempSave exists: " + tempSave.exists()); //debug
System.out.println("-----------------------"); //debug
run++; //debug
if (!tempSave.exists()) {
saveNames.remove(x);
sessionIDs.remove(x);
}
}
for (int x = 0; x < saveNames.size(); x++) {
System.out.println(saveNames.elementAt(x));
System.out.println(sessionIDs.elementAt(x));
}
slistReader.close();
}
private static void slistCleanup()引发IOException{
私有静态向量存储名=new Vector();
私有静态向量sessionIDs=新向量();
Scanner slistReader=新扫描仪(新文件读取器(会话列表));
文件保存;
字符串路径;
int run=1;
字符串tempName=“”;
int-tempID=0;
对于(int x=0;x
如果您需要更多代码,请告诉我。如果您遇到问题,因为在循环过程中从数组中删除项目,您可以在循环之前创建一个新数组,并将保留的项目放入其中。循环完成后,新数组将只包含您保留的项目,您可以将原始数组设置为您创建的新数组。向后循环:
for (int x = saveNames.size()-1; x >= 0; x--)
一种只需对现有代码进行少量更改的方法是反向遍历向量
for (int x = saveNames.size() - 1; x >= 0; x--) {
...
}
从对象中移除项目时,始终向后循环对象,因此:
for (int x = saveNames.size()-1; x >=0; x--) {
这样,移除的项目不会给您带来问题
出现问题的原因是从x=0开始;您删除了x=0(因此x=1是新的x=0,x=2是新的x=1等),但您继续移动到x=1,跳过一个
另一方面,如果从saveNames.size()开始,则为-1:
你从(例如)9开始,删除它,9现在是空的,但我们还是继续到8。8不受影响,因为它在9之前您只需添加要删除的索引,然后从最后一个到第一个删除它们。或者你也可以使用
x--;
移除元素时,在循环内部 正如Fildor在评论中指出的那样,您可以使用迭代器来实现这一点
Iterator namesItr = saveNames.iterator();
Iterator sessionItr = sessionIDs.iterator();
while(namesItr.hasNext() && sessionItr.hasNext()) {
Object currentName = namesItr.next();
Object currentSession = sessionItr.next();
if (!tempSave.exists()) {
namesItr.remove();
sessionItr.remove();
}
}
在我看来,通过循环删除项目的最佳简单方法是:
最简单的方法就是取出
x++
说明:当您删除
saveNames.remove(x)
和x=0
时,索引1中的内容将移动到索引0。X仍然是0,它现在将删除第二项,该项现在位于索引0处。删除所有项目后,saveNames.size()
将为0,x不再小于saveNames.size()
,因此循环将中断。使用迭代器及其删除方法。可能的副本,可能您应该使用ArrayList。看,我知道我可以使用ArrayList,但我这样做是为了编程类的最后一个项目。老师不希望我们使用他没教过我们的东西。否则,我就要用它们了。+1宾果!这种代码模式是一个常见的问题,将索引从最后一个循环到第一个是解决方案。@Bohemian这也是关于堆栈溢出的一个非常常见的问题:)@dasblinkenlight我想了一段时间,对于某些重复出现的问题,应该有原型代码,但也许这就是教科书的目的。PS我支持你的投票:)@Bohemian我记得我的老师很久以前就展示了这个“把戏”:)在那之前,我总是在删除时降低索引。。。我自己没有想到这个主意,感觉很糟糕,但看到我不是唯一的一个,这让我很安心;-)