Java читает имя файла и хранится в порядке возрастания - PullRequest
0 голосов
/ 12 сентября 2018

Чтение файлов из определенного каталога и сохранение всех имен файлов в массиве

File directory = new File(path);
        File[] listOfFiles = directory.listFiles();
        int fileCount = directory.list().length;
        List<String> files = new ArrayList<>();
        for (int i = 0; i < fileCount; i++) {
            String inputFilePath = path + listOfFiles[i].getName();
            String inputFileName = listOfFiles[i].getName();
            files.add(inputFileName);
        }

Я ожидаю, что файлы будут храниться в порядке (в порядке возрастания), но фактическое значение равно

1.jpg
10.jpg
11.jpg
12.jpg
13.jpg
14.jpg
15.jpg
16.jpg
17.jpg
18.jpg
19.jpg
2.jpg
20.jpg
21.jpg
22.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg

дайте мне знать, как сохранить файл в порядке возрастания, например 1,2,3,4,5....10,11....20,21...etc.,)

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Конечно, это в таком порядке.Файлы упорядочены не арифметически, а лексикографически.Вам нужно будет переименовать все одноразрядные файлы, чтобы включить начальный ноль, чтобы достичь ожидаемого порядка, или написать собственный метод упорядочения и применить его к списку, содержащему ваши имена файлов.

0 голосов
/ 12 сентября 2018

Вы можете использовать Collections.sort () вместе с пользовательским компаратором, который сравнивает целочисленный префикс каждого имени файла, как показано ниже в вашем ArrayList files:

Collections.sort(files, new Comparator<String>() {
    public int compare(String s1, String s2) {
        int s1Num = Integer.valueOf(s1.split("[.jpg]")[0]);
        int s2Num = Integer.valueOf(s2.split("[.jpg]")[0]);
        if (s1Num == s2Num) { return 0; } 
        else if (s1Num <  s2Num) { return -1; }
        else { return 1; }
    }
});

for (String file: files) {
    System.out.println(file);
}

Выход:

1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg
10.jpg
11.jpg
12.jpg
13.jpg
14.jpg
15.jpg
16.jpg
17.jpg
18.jpg
19.jpg
20.jpg
21.jpg
22.jpg
0 голосов
/ 12 сентября 2018

Вы хотите отсортировать объекты ваших файлов по именам в порядке возрастания.Вам нужно создать свой компаратор имени файла.Псевдокод здесь.

class FileNameComparator implements Comparator<File> {

    private final Pattern NUMERIC_PART_PATTER = Pattern.compile("([0-9]+)[.]");

    @Override
    public int compare(File file1, File file2) {
        String name1 = file1.getName();
        String name2 = file2.getName();
        int part1 = retrieveNumericPart(name1);
        int part2 = retrieveNumericPart(name2);
        return part1 - part2;
    }

    private int retrieveNumericPart(String str) {
        Matcher matcher = NUMERIC_PART_PATTER.matcher(str);
        if (!matcher.find()) {
            return 0;
        }

        String group = matcher.group(1);
        return Integer.parseInt(group);
    }
}

Затем просто воспользуйтесь этим компаратором.

File[] sortedFiles = Arrays.sort(listOfFiles, new FileNameComparator());

Затем вы можете перебирать файлы, и они сортируются так, как вы хотели!Без компаратора вы получите список строк, отсортированных по алфавиту (так как строки сортируются по умолчанию.)

...