如何在使用后清除此数组列表?

时间:2018-06-07 08:18:40

标签: java arraylist collections

例如 -

class Explorer {

     private List <File> all_files = new ArrayList <File> ();

    File [] explore (...) {
        ....
    } // this function returns, after modification, 
      // the all_files variable declared above.
      // Note :- this function is recursive.
}

我创建了一个Explorer类的对象并调用explore方法,对于第一次调用,这根本不会引起任何问题,我得到了我期望的结果。但是,如果我下次以类似的方式尝试使用同一个对象,那么,您已经可以预期会发生什么。基本上,explore方法会在all_files的末尾附加一些文件并将其返回(作为数组)。第二次调用该方法会在不先清除all_files的情况下附加更多文件。

所以,我正在寻找一种策略,在一次使用后清除all_files。我不能在我的方法结束时添加类似clear(all_files)的语句,因为它是递归的,all_files是全局的。如果可能的话,我希望这个清洁过程是自动的。即,不知何故,我的程序应该在整个递归完成时清除它(如何检测?)。建议策略。

编辑:对于那些对我的策略充满好奇和怀疑的人来说,这是完整的代码(未注释) -

public class Explorer {   
    private List <File> all_files = new ArrayList <File> ();
    private int current_index = 0;

    public int depth_index;

    Explorer () { depth_index = Integer.MAX_VALUE; }
    Explorer (int index) { depth_index = index; }

    public File[] explore (String path) {

        if (++current_index > depth_index) {
            return all_files.toArray(new File[0]);
        }

        File f = new File (path);
        File[] dir_files = f.listFiles();

        for (File file : dir_files) {
            if (file.isFile())
                all_files.add(file);
            else
                explore (file.getPath());
        }

        current_index --;
        return all_files.toArray(new File[0]);
    }
}

2 个答案:

答案 0 :(得分:2)

如果在递归调用中需要List,请在递归调用中传递它:

class Explorer {

    File[] explore (...) {
        return explore(..., new ArrayList<>());
    }

    private File[] explore(..., List<File> all_files) {
      // Stuff.
    }
}

答案 1 :(得分:0)

我认为您不必在此课程中保留all_files并担心明确它。如果你真的需要一个数组,那么很容易将集合转换为数组。如果你需要不可修改的colleciton(就像数组一样),只需用Collections.unmodifiableSet()装饰它(这是Set,但是其他集合还有其他装饰器):

final class Explorer {

    public final int depth;

    Explorer() {
        this(Integer.MAX_VALUE);
    }

    Explorer(int depth) {
        this.depth = depth;
    }

    private static final File[] EMPTY = new File[0];

    public File[] explore(String path) {
        File file = new File(path);
        file = file.isDirectory() ? file : file.getParentFile();
        Set<File> files = addFiles(file, 0, new TreeSet<>());

        return files.isEmpty() ? EMPTY : files.toArray(new File[files.size()]);
    }

    private Set<File> addFiles(File dir, int depth, Set<File> files) {
        if (depth > this.depth)
            return files;

        File[] dirFiles = dir != null ? dir.listFiles() : null;

        if (dirFiles == null || dirFiles.length == 0)
            return files;

        for (File file : dirFiles) {
            if (file.isFile())
                files.add(file);
            else
                addFiles(file, depth + 1, files);
        }

        return files;
    }
}