重复的数组列表

时间:2017-12-24 15:29:05

标签: java android arrays

我一直在进行一个显示文本文件的简单目录扫描,然后将输出打印到文本区域。如果我尝试再次使用它,它会如何重复输出 下面是公共阵列:

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 个答案:

答案 0 :(得分:1)

您似乎也在子目录中以递归方式查找?无论如何,试试这个。您致电getFiles(dir)的地方改为fileList = 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的范围在方法之外,并且正在重复使用并附加到。{1}}。现在我们使用textFiles代替,每次首次调用方法时都应为空。更简单的解决方法是在致电fileList = new ArrayList<>()之前立即执行getFiles(dir);,但上面的代码要好得多。