java - 使用Java按数字顺序返回目录中的文件名
问题描述
我们有一种情况,我们的目录中的文件带有前缀(比如MyFile
),后跟一个数字(例如 MyFile1、MyFile2、MyFile3,...)。我们希望返回目录中的文件名列表,但按数字顺序。例如 MyFile1、MyFile2、MyFile3、...、MyFile9、MyFile10、MyFile11、MyFile12 等)。
JavaFile
类list()
方法返回文件名列表,但按字典顺序(MyFile1、MyFile10、MyFile11、MyFile12、MyFile2、MyFile3...、MyFile9 等)。是否有 API 调用可以按照我们想要的顺序返回文件名?
附录Java File.list()
中建议的解决方案的轻微变体是否一致?对我有用。我创建了一个名为. 代码如下:generateConsistentOrder
protected void generateConsistentOrder(String[] files, String prefixToDrop) {
Arrays.sort(
files,
new Comparator<String>() {
public int compare(String a, String b) {
Integer retVal = null;
try {
Integer intA = Integer.parseInt(a.substring(a.indexOf(prefixToDrop)+prefixToDrop.length()));
Integer intB = Integer.parseInt(b.substring(b.indexOf(prefixToDrop)+prefixToDrop.length()));
retVal = intA.compareTo(intB);
}
catch (Exception e) {
retVal = a.compareTo(b);
}
return retVal;
}
});
}
解决方案
您可以做的是使用Files#list
来自java.nio
包的方法。有了这些,您最终将得到一个Path
对象流,可以在其上应用一个Comparator
将使用Path#getFileName
.
使用 than in place 你需要有一个Comparator
接口的实现,它将从给定的文件路径中刮取数字并将值与其他值进行比较。一个简单的例子是这样的:
public class PathComparator implements Comparator<Path> {
private static final Pattern PATTERN = Pattern.compile("\\d+");
@Override
public int compare(Path o1, Path o2) {
var path1Matcher = PATTERN.matcher(o1.getFileName().toString());
var path2Matcher = PATTERN.matcher(o2.getFileName().toString());
Integer file1 = 0;
Integer file2 = 0;
if (path1Matcher.find()) {
file1 = Integer.valueOf(path1Matcher.group());
}
if (path2Matcher.find()) {
file2 = Integer.valueOf(path2Matcher.group());
}
return file1.compareTo(file2);
}
}
将它们放在一起看起来像这样:
public static List<Path> listOrdered(String path) {
try (var fileStream = Files.list(Paths.get(path))) {
return fileStream
.sorted(new PathComparator())
.toList();
} catch (IOException e) {
e.printStackTrace();
}
return Collections.emptyList();
}
请注意,我在此示例中使用 Java 16,但您可以轻松修改它以使用较旧的 Java 版本。
推荐阅读
- linux - collect2:错误:ld 返回 1 个退出状态(-lcudnn)
- javascript - NextJs 渲染错误
- python - 使用 plot_confusion_matrix 绘制多个混淆矩阵
- apache-spark - Pyspark:容器以非零退出代码 143 退出
- linux - lxd 初始化失败
- java - io.jsonwebtoken.UnsupportedJwtException:不支持签名声明 JWS
- python - 当 .py 文件包含 __name__==__main 时,Python 中的方法执行优先级是多少?
- php - max_execution_time 为 240 秒 - 超过了 60 秒的超时时间
- vue-router - 如何在 Nuxt 中为特定路由设置中间件
- maximo - 在 Maximo 7.6 中的交互节点之后自动路由工作流