Как очистить этот список массивов после использования? - PullRequest
0 голосов
/ 07 июня 2018

Например -

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 голосов
/ 07 июня 2018

Я думаю, что вам не нужно держать all_files в этом классе и беспокоиться о его очистке.Если вам действительно нужен массив, тогда легко преобразовать коллекцию в массив.Если вам нужна немодифицируемая коллекция (как массив), просто украсьте ее 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;
    }
}
0 голосов
/ 07 июня 2018

Если вам нужен List в рекурсивных вызовах, передайте его в рекурсивных вызовах:

class Explorer {

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

    private File[] explore(..., List<File> all_files) {
      // Stuff.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...