Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环的Vector.remove()_Java_File_For Loop_Vector - Fatal编程技术网

Java 循环的Vector.remove()

Java 循环的Vector.remove(),java,file,for-loop,vector,Java,File,For Loop,Vector,我正在编写一个游戏,几乎完成了保存文件系统。我有两个向量(一个持有savegame的名称,一个持有sessionID) 在启动时,程序将从文件中读取数据,并将该信息添加到向量中。然后调用另一个方法来检查向量中显示的文件是否确实存在。如果没有,它们将从向量中删除。最后,将矢量打印到文件并重写文件 我遇到的问题是for循环没有检查向量中的每一项,因为移除项时,Vector.size()会减少。是否有更好的方法来形成for循环,或者有什么解决方法可以使用 private static void sli

我正在编写一个游戏,几乎完成了保存文件系统。我有两个向量(一个持有savegame的名称,一个持有sessionID

在启动时,程序将从文件中读取数据,并将该信息添加到向量中。然后调用另一个方法来检查向量中显示的文件是否确实存在。如果没有,它们将从向量中删除。最后,将矢量打印到文件并重写文件

我遇到的问题是for循环没有检查向量中的每一项,因为移除项时,Vector.size()会减少。是否有更好的方法来形成for循环,或者有什么解决方法可以使用

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();
    }
}

在我看来,通过循环删除项目的最佳简单方法是:

  • 使用for循环扫描项目并添加项目删除列出要删除的项目
  • list.removeAll(itemsToDelete)

  • 最简单的方法就是取出
    x++


    说明:当您删除
    saveNames.remove(x)
    x=0
    时,索引1中的内容将移动到索引0。X仍然是0,它现在将删除第二项,该项现在位于索引0处。删除所有项目后,
    saveNames.size()
    将为0,x不再小于
    saveNames.size()
    ,因此循环将中断。

    使用迭代器及其删除方法。可能的副本,可能您应该使用ArrayList。看,我知道我可以使用ArrayList,但我这样做是为了编程类的最后一个项目。老师不希望我们使用他没教过我们的东西。否则,我就要用它们了。+1宾果!这种代码模式是一个常见的问题,将索引从最后一个循环到第一个是解决方案。@Bohemian这也是关于堆栈溢出的一个非常常见的问题:)@dasblinkenlight我想了一段时间,对于某些重复出现的问题,应该有原型代码,但也许这就是教科书的目的。PS我支持你的投票:)@Bohemian我记得我的老师很久以前就展示了这个“把戏”:)在那之前,我总是在删除时降低索引。。。我自己没有想到这个主意,感觉很糟糕,但看到我不是唯一的一个,这让我很安心;-)