如何以升序排列文件名?

我在文件夹中有一组文件,所有文件都以相似的名称开头,除了一个。这是一个例子:

Coordinate.txt

Spectrum_1.txt

Spectrum_2.txt

Spectrum_3.txt

.

.

.

Spectrum_11235

我可以列出指定文件夹中的所有文件,但是列表的排列顺序不是频谱编号的升序。示例:执行程序时得到以下结果:

Spectrum_999.txt

Spectrum_9990.txt

Spectrum_9991.txt

Spectrum_9992.txt

Spectrum_9993.txt

Spectrum_9994.txt

Spectrum_9995.txt

Spectrum_9996.txt

Spectrum_9997.txt

Spectrum_9998.txt

Spectrum_9999.txt

但是这个顺序是不正确的。在Spectrum_999.txt之后应该有Spectrum_1000.txt文件。有人可以帮忙吗?这是代码:

import java.io.*;

import java.util.Arrays;

import java.util.Comparator;

import java.util.Scanner;

public class FileInput {

public void userInput()

{

Scanner scanner = new Scanner( System.in );

System.out.println("Enter the file path: ");

String dirPath = scanner.nextLine(); // Takes the directory path as the user input

File folder = new File(dirPath);

if(folder.isDirectory())

{

File[] fileList = folder.listFiles();

Arrays.sort(fileList);

System.out.println("\nTotal number of items present in the directory: " + fileList.length );

// Lists only files since we have applied file filter

for(File file:fileList)

{

System.out.println(file.getName());

}

// Creating a filter to return only files.

FileFilter fileFilter = new FileFilter()

{

@Override

public boolean accept(File file) {

return !file.isDirectory();

}

};

fileList = folder.listFiles(fileFilter);

// Sort files by name

Arrays.sort(fileList, new Comparator()

{

@Override

public int compare(Object f1, Object f2) {

return ((File) f1).getName().compareTo(((File) f2).getName());

}

});

//Prints the files in file name ascending order

for(File file:fileList)

{

System.out.println(file.getName());

}

}

}

}

回答:

您要的是数字排序。您需要实现一个Comparator并将其传递给Arrays#sort方法。在compare方法中,您需要从每个文件名中提取数字,然后比较数字。

之所以得到现在得到的输出,是因为排序按字母数字顺序进行

这是一种非常基本的方法。此代码使用简单的String操作来提取数字。如果您知道文件名的格式,则此方法有效Spectrum_<number>.txt。一种更好的提取方法是使用正则表达式。

public class FileNameNumericSort {

private final static File[] files = {

new File("Spectrum_1.txt"),

new File("Spectrum_14.txt"),

new File("Spectrum_2.txt"),

new File("Spectrum_7.txt"),

new File("Spectrum_1000.txt"),

new File("Spectrum_999.txt"),

new File("Spectrum_9990.txt"),

new File("Spectrum_9991.txt"),

};

@Test

public void sortByNumber() {

Arrays.sort(files, new Comparator<File>() {

@Override

public int compare(File o1, File o2) {

int n1 = extractNumber(o1.getName());

int n2 = extractNumber(o2.getName());

return n1 - n2;

}

private int extractNumber(String name) {

int i = 0;

try {

int s = name.indexOf('_')+1;

int e = name.lastIndexOf('.');

String number = name.substring(s, e);

i = Integer.parseInt(number);

} catch(Exception e) {

i = 0; // if filename does not match the format

// then default to 0

}

return i;

}

});

for(File f : files) {

System.out.println(f.getName());

}

}

}

Spectrum_1.txt

Spectrum_2.txt

Spectrum_7.txt

Spectrum_14.txt

Spectrum_999.txt

Spectrum_1000.txt

Spectrum_9990.txt

Spectrum_9991.txt

以上是 如何以升序排列文件名? 的全部内容, 来源链接: utcz.com/qa/411480.html

回到顶部