Java读取文件名并以升序存储

时间:2018-09-12 09:19:28

标签: java java.nio.file

从特定目录中读取文件,并将所有文件名存储在arraylist中

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 :(得分:1)

您可以将 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

答案 1 :(得分:0)

您想按文件名的升序对文件对象进行排序。您需要创建文件名比较器。此处为伪代码。

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());

然后,您可以循环浏览文件,然后根据需要对它们进行排序!没有比较器,您将获得按字母顺序排序的字符串列表(因为默认情况下,字符串已排序)。

答案 2 :(得分:0)

当然是按照这个顺序。这些文件不是按照算术顺序而是按照字典顺序。您必须将所有一位数字文件重命名为包含前导零以实现所需的顺序,或者编写自定义排序方法并将其应用于包含文件名的列表。