I have a set of files in a folder, and all of them starting with a similar name, except one. Here is an example:
Coordinate.txt
Spectrum_1.txt
Spectrum_2.txt
What you are asking for is numerical sort. You need implement a Comparator and pass it to the Arrays#sort method. In the compare method you need to extract the number from each filename an then compare the numbers.
The reason why you get the output you are getting now is that sorting happens alphanumerically
Here a is a very basic way of doing it. This code uses simple String-operation to extract the numbers. This works if you know the format of the filename, in your case Spectrum_. A better way of doing the extraction is to use regular expression.
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() {
@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());
}
}
}
Output
Spectrum_1.txt
Spectrum_2.txt
Spectrum_7.txt
Spectrum_14.txt
Spectrum_999.txt
Spectrum_1000.txt
Spectrum_9990.txt
Spectrum_9991.txt