Java/Android 获取文件夹的文件列表(file.listFiles())并按名称排序,中文优先

排序规则

因为是中国人,习惯性看中文文件夹放前面比较顺眼,所以在别人博客(https://blog.csdn.net/da_caoyuan/article/details/56664673)的基础上,加上了自己的排序规则。

默认排序规则是按照ASCII码表排序(http://ascii.911cha.com/),排序的步骤大概是:部分符号->数字->部分符号->大写字母->部分符号->小写字母->部分符号->中文。

所以我修改了逻辑,排序变成:中文->数字->字母(不区分大小写)->特殊字符

算法原理

1、将字符串不区分大小写

2、把字符串中的中文变成拼音的首字母

3、识别字符串的第一个字符,如果是中文则在前面加上字符“.”,用于在compareTo方法中,排在数字前面

4、识别字符串的第一个字符,如果是符号(看ASCII表)则在前面加上字符“{”,用于在compareTo方法中,排在Z后面

代码

代码就不上注释了,也比较简单

        File[] files = new File(path).listFiles();
        List<File> list;
        if (files == null) {
            list = new ArrayList<>();
        } else {
            list = Arrays.asList(files);
        }
        Collections.sort(list, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                if (o1.isDirectory() && o2.isFile())
                    return -1;
                if (o1.isFile() && o2.isDirectory())
                    return 1;
                String name1 = o1.getName().toUpperCase();
                char c1 = name1.toCharArray()[0];
                String name11 = "";
                for (char c11 : name1.toCharArray()) {
                    name11 += Pinyin.toPinyin(c11);
                }

                if (c1 >= 0x4E00 && c1 <= 0x9FA5) {
                    name1 = "." + name11;
                } else if (c1 < 48) {
                    name1 = "{" + name11;
                } else if (c1 > 57 && c1 < 65) {
                    name1 = "{" + name11;
                }

                String name2 = o2.getName().toUpperCase();

                char c2 = name2.toCharArray()[0];

                String name22 = "";
                for (char c22 : name2.toCharArray()) {
                    name22 += Pinyin.toPinyin(c22);
                }

                if (c2 >= 0x4E00 && c2 <= 0x9FA5) {
                    name2 = "." + name22;
                } else if (c2 < 48) {
                    name2 = "{" + name22;
                } else if (c2 > 57 && c2 < 65) {
                    name2 = "{" + name22;
                }
                return name1.compareTo(name2);
            }
        });

 

### 回答1: 可以使用Java 8的新特性,如Streams和Lambdas来实现。例如: ``` Path directory = ... List<Path> files = Files.list(directory) .filter(Files::isRegularFile) .sorted((o1, o2) -> -o1.toFile().lastModified() .compareTo(o2.toFile().lastModified())) .collect(Collectors.toList()); ``` 这将返回目录中的所有文件,并按最后修改日期倒序排序。 ### 回答2: 要获取最新的文件,可以使用以下步骤: 首先,需要引入`java.nio.file`和`java.nio.file.attribute`包,以便使用与文件相关的类和方法。 接下来,创建一个`List<java.nio.file.Path>`类型的变量,用于存储文件路径。 然后,使用`java.nio.file.Paths`类的`get`方法,传入文件路径作为参数,获取一个`java.nio.file.Path`对象,并将其添加到上述列表中。 接着,使用`java.nio.file.Files`类的`newest`方法,传入文件路径列表作为参数,获取最新的文件的`java.nio.file.Path`对象。 最后,将得到的最新文件的路径打印出来或做其他相应的处理。 以下是通过Java代码实现上述步骤的示例: ```java import java.nio.file.*; import java.nio.file.attribute.*; import java.io.IOException; import java.util.List; import java.util.Comparator; public class Main { public static void main(String[] args) { List<Path> filePaths = new ArrayList<>(); // 创建存储文件路径的列表 // 添加文件路径到列表filePaths.add(Paths.get("path/to/file1.txt")); filePaths.add(Paths.get("path/to/file2.txt")); filePaths.add(Paths.get("path/to/file3.txt")); try { // 获取最新的文件 Path newestFile = Files.newest(filePaths, new Comparator<Path>() { // 自定义比较器用于比较文件的最后修改时间 @Override public int compare(Path file1, Path file2) { try { FileTime fileTime1 = Files.getLastModifiedTime(file1); FileTime fileTime2 = Files.getLastModifiedTime(file2); return fileTime1.compareTo(fileTime2); } catch (IOException e) { e.printStackTrace(); } return 0; } }); System.out.println("最新的文件是:" + newestFile.toString()); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码中,根据提供的文件路径列表,通过比较文件的最后修改时间,找到最新的文件并打印出来。请注意,需要替换示例代码中的文件路径,以便适应实际情况。 ### 回答3: 要获取最新的文件,可以使用以下方法: 1. 首先,我们需要获取文件所在的目录。假设文件所在的目录是 "/path/to/directory"。 2. 使用 java.nio.file 包提供的类和方法,我们可以通过以下方式获取文件夹下的所有文件: ``` Path directoryPath = Paths.get("/path/to/directory"); try (Stream<Path> fileStream = Files.list(directoryPath)) { List<Path> fileList = fileStream.collect(Collectors.toList()); } ``` 这样,我们就能够得到一个包含该目录下所有文件列表 fileList。 3. 然后,我们可以通过对文件的修改时间进行比较,来找到最新的文件。可以使用 java.nio.file.attribute 包提供的类和方法来获取和比较文件的属性。 ``` Path newestFile = null; FileTime newestFileTime = null; for (Path file : fileList) { FileTime fileTime = Files.getLastModifiedTime(file); if (newestFileTime == null || fileTime.compareTo(newestFileTime) > 0) { newestFile = file; newestFileTime = fileTime; } } ``` 通过以上代码,我们可以找到最新的文件 newestFile,而 newestFileTime 表示该文件的最后一次修改时间。 总结起来,要获取最新的文件,我们可以通过以下步骤来完成: 1. 获取文件所在目录的路径。 2. 使用 Files.list() 方法获取该目录下的所有文件。 3. 遍历文件列表,通过 getLastModifiedTime() 方法获取文件的最后一次修改时间,并比较找到最新的文件。 以上是用 java List<java.nio.file.Path> 获取最新文件的方法。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值