首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java读取文件名并按升序存储

Java读取文件名并按升序存储
EN

Stack Overflow用户
提问于 2018-09-12 17:19:28
回答 3查看 570关注 0票数 1

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

代码语言:javascript
复制
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);
        }

我期望按顺序(升序)存储文件,但实际情况是

代码语言:javascript
复制
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.,)一样以升序存储文件

EN

回答 3

Stack Overflow用户

发布于 2018-09-12 17:55:26

您可以将与一个自定义比较器一起使用,它会比较每个文件名的整数前缀,如ArrayList files上的下面所示:

代码语言:javascript
复制
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);
}

输出:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-09-12 17:34:26

您希望按文件对象的名称以升序对其进行排序。你需要创建你的文件名比较器。这里是伪代码。

代码语言:javascript
复制
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);
    }
}

然后使用这个比较器。

代码语言:javascript
复制
File[] sortedFiles = Arrays.sort(listOfFiles, new FileNameComparator());

然后你可以遍历你的文件,它们会按照你想要的方式进行排序!如果没有比较器,您将获得按字母顺序排序的字符串列表(因为默认情况下字符串是排序的)。

票数 0
EN

Stack Overflow用户

发布于 2018-09-12 17:36:10

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52291695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档