使用Java以数字顺序返回目录中的文件名
我们遇到的情况是,目录中的文件带有前缀(例如使用Java以数字顺序返回目录中的文件名,java,Java,我们遇到的情况是,目录中的文件带有前缀(例如MyFile),后跟数字(例如MyFile1、MyFile2、MyFile3等)。我们希望返回目录中的文件名列表,但以数字顺序。例如MyFile1、MyFile2、MyFile3、…、MyFile9、MyFile10、MyFile11、MyFile12等) JavaFileclasslist()方法返回文件名列表,但按字典顺序(MyFile1、MyFile10、MyFile11、MyFile12、MyFile2、MyFile3、MyFile9等)。是否
MyFile
),后跟数字(例如MyFile1、MyFile2、MyFile3等)。我们希望返回目录中的文件名列表,但以数字顺序。例如MyFile1、MyFile2、MyFile3、…、MyFile9、MyFile10、MyFile11、MyFile12等)
JavaFile
classlist()
方法返回文件名列表,但按字典顺序(MyFile1、MyFile10、MyFile11、MyFile12、MyFile2、MyFile3、MyFile9等)。是否有API调用可以按我们想要的顺序返回文件名
附录
中建议的解决方案的一个微小变化对我起了作用。我创建了一个名为
generateConsistenOrder
的新方法。代码如下:
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;
}
});
}
受保护的void generateConsistentOrder(字符串[]文件,字符串prefixToDrop){
数组.排序(
文件夹,
新比较器(){
公共整数比较(字符串a、字符串b){
整数retVal=null;
试一试{
整数intA=Integer.parseInt(a.substring(a.indexOf(prefixToDrop)+prefixToDrop.length());
Integer intB=Integer.parseInt(b.substring(b.indexOf(prefixToDrop)+prefixToDrop.length());
retVal=内部比较(intB);
}
捕获(例外e){
retVal=a.与(b)相比;
}
返回返回;
}
});
}
您可以使用java.nio
包中的Files#list
方法。有了它,您将得到一个Path
对象流,可以对其应用一个比较器
,该比较器将使用Path#getFileName
对它们进行排序
有了than,您需要有一个Comparator
接口的实现,该接口将从给定的文件路径中刮取数字,并将该值与其他值进行比较。一个简单的例子是:
公共类PathComparator实现Comparator{
私有静态最终模式=Pattern.compile(\\d+);
@凌驾
公共整数比较(路径o1,路径o2){
var path1Matcher=PATTERN.matcher(o1.getFileName().toString());
var path2Matcher=PATTERN.matcher(o2.getFileName().toString());
整数file1=0;
整数file2=0;
if(path1Matcher.find()){
file1=Integer.valueOf(path1Matcher.group());
}
if(path2Matcher.find()){
file2=Integer.valueOf(path2Matcher.group());
}
返回file1.compareTo(file2);
}
}
然后,将所有内容组合在一起将如下所示:
公共静态列表listOrdered(字符串路径){
try(var fileStream=Files.list(path.get(path))){
返回文件流
.sorted(新的PathComparator())
.toList();
}捕获(IOE异常){
e、 printStackTrace();
}
返回集合。emptyList();
}
注意:本例中我使用的是Java16,但是您可以轻松地修改它以使用较旧的Java版本。您可以做的是使用
Java.nio
包中的文件#列表
方法。有了它,您将得到一个Path
对象流,可以对其应用一个比较器
,该比较器将使用Path#getFileName
对它们进行排序
有了than,您需要有一个Comparator
接口的实现,该接口将从给定的文件路径中刮取数字,并将该值与其他值进行比较。一个简单的例子是:
公共类PathComparator实现Comparator{
私有静态最终模式=Pattern.compile(\\d+);
@凌驾
公共整数比较(路径o1,路径o2){
var path1Matcher=PATTERN.matcher(o1.getFileName().toString());
var path2Matcher=PATTERN.matcher(o2.getFileName().toString());
整数file1=0;
整数file2=0;
if(path1Matcher.find()){
file1=Integer.valueOf(path1Matcher.group());
}
if(path2Matcher.find()){
file2=Integer.valueOf(path2Matcher.group());
}
返回file1.compareTo(file2);
}
}
然后,将所有内容组合在一起将如下所示:
公共静态列表listOrdered(字符串路径){
try(var fileStream=Files.list(path.get(path))){
返回文件流
.sorted(新的PathComparator())
.toList();
}捕获(IOE异常){
e、 printStackTrace();
}
返回集合。emptyList();
}
注意:本例中我使用的是Java 16,但您可以轻松地修改它以使用较旧的Java版本。这对您有帮助吗:?这对您有帮助吗:?
Path.compareTo()
依赖于平台,它很可能按字典顺序对字符串进行排序。您需要编写一个自定义比较器或使用一些实用函数。@AlexShesterov您完全正确,我似乎误解了这个问题。Path.compareTo()
依赖于平台,它很可能按字典顺序对字符串排序。您需要编写一个自定义比较器或使用一些实用函数。@AlexShesterov您完全正确,我似乎误解了这个问题。