使用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等)

Java
File
class
list()
方法返回文件名列表,但按字典顺序(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您完全正确,我似乎误解了这个问题。