有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java重复数组列表

我一直在做一个简单的目录扫描,显示文本文件,然后将输出打印到文本区域。然而,由于某种原因,如果我再次尝试使用它,它将复制输出 以下是公共阵列:

public ArrayList<File> getfile(File dir) {
        File listFile[] = dir.listFiles();
        if (listFile != null && listFile.length > 0) {
            for (int i = 0; i < listFile.length; i++) {

                if (listFile[i].isDirectory()) {
                    fileList.add(listFile[i]);
                    getfile(listFile[i]);

                } else {
                    if (listFile[i].getName().endsWith(".txt")) {
                        fileList.add(listFile[i]);
                    }
                }

            }
        }
        return fileList;
    }

这是onclick按钮代码

File root = new File(Environment.getExternalStorageDirectory() + File.separator + user_inputfilename); //"searches what the userinput"
                            getfile(root);
                            for (int i = 0; i < fileList.size(); i++) {
                                newText.append(fileList.get(i).getName()+"\n");
                            }

我真的不知道我做错了什么?有办法清除阵列吗?任何帮助都将不胜感激。谢谢!


共 (1) 个答案

  1. # 1 楼答案

    你似乎也在递归地查看子目录?无论如何,试试这个。当您调用getFiles(dir)dofileList = getTextFilesRecursively(dir)时:

      public ArrayList<File> getTextFilesRecursively(File dir) {
        return getTextFilesRecursively(dir, new ArrayList<>());
      }
    
      private ArrayList<File> getTextFilesRecursively(File dir, ArrayList<File> textFiles) {
        File[] allFilesAndFoldersInDir = dir.listFiles();
    
        if(textFiles == null) {
          textFiles = new ArrayList<>();
        }
    
        if (allFilesAndFoldersInDir != null && allFilesAndFoldersInDir.length > 0) {
          for (File fileOrFolderInDir : allFilesAndFoldersInDir) {
            if (fileOrFolderInDir.isDirectory()) {
              getTextFilesRecursively(fileOrFolderInDir, textFiles);
            } else if (fileOrFolderInDir.getName().endsWith(".txt")) {
              textFiles.add(fileOrFolderInDir);
            }
          }
        }
    
        return textFiles;
      }
    

    我相信您的根本问题是fileList.add(listFile[i]);,因为fileList的范围超出了方法的范围,并且被重用和附加到了方法中。现在我们改用textFiles,每次第一次调用该方法时,它都应该是空的。一个更简单的修复方法是在调用fileList = new ArrayList<>()之前立即执行getFiles(dir);,但是上面的代码要好得多