从特定目录中读取文件,并将所有文件名存储在arraylist中
File directory = new File(path);
File[] listOfFiles = directory.listFiles();
int fileCount = directory.list().length;
List<String> files = new ArrayList<>();
for (int i = 0; i < fileCount; i++) {
String inputFilePath = path + listOfFiles[i].getName();
String inputFileName = listOfFiles[i].getName();
files.add(inputFileName);
}
我期望以有序(升序)存储文件,但实际是
1.jpg
10.jpg
11.jpg
12.jpg
13.jpg
14.jpg
15.jpg
16.jpg
17.jpg
18.jpg
19.jpg
2.jpg
20.jpg
21.jpg
22.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg
让我知道如何以1,2,3,4,5....10,11....20,21...etc.,)
之类的升序存储文件
答案 0 :(得分:1)
您可以将 Collections.sort() 与自定义比较器一起使用,该比较器将比较每个文件名的整数前缀,例如下面的ArrayList files
:
Collections.sort(files, new Comparator<String>() {
public int compare(String s1, String s2) {
int s1Num = Integer.valueOf(s1.split("[.jpg]")[0]);
int s2Num = Integer.valueOf(s2.split("[.jpg]")[0]);
if (s1Num == s2Num) { return 0; }
else if (s1Num < s2Num) { return -1; }
else { return 1; }
}
});
for (String file: files) {
System.out.println(file);
}
输出:
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg
10.jpg
11.jpg
12.jpg
13.jpg
14.jpg
15.jpg
16.jpg
17.jpg
18.jpg
19.jpg
20.jpg
21.jpg
22.jpg
答案 1 :(得分:0)
您想按文件名的升序对文件对象进行排序。您需要创建文件名比较器。此处为伪代码。
class FileNameComparator implements Comparator<File> {
private final Pattern NUMERIC_PART_PATTER = Pattern.compile("([0-9]+)[.]");
@Override
public int compare(File file1, File file2) {
String name1 = file1.getName();
String name2 = file2.getName();
int part1 = retrieveNumericPart(name1);
int part2 = retrieveNumericPart(name2);
return part1 - part2;
}
private int retrieveNumericPart(String str) {
Matcher matcher = NUMERIC_PART_PATTER.matcher(str);
if (!matcher.find()) {
return 0;
}
String group = matcher.group(1);
return Integer.parseInt(group);
}
}
然后只使用此比较器。
File[] sortedFiles = Arrays.sort(listOfFiles, new FileNameComparator());
然后,您可以循环浏览文件,然后根据需要对它们进行排序!没有比较器,您将获得按字母顺序排序的字符串列表(因为默认情况下,字符串已排序)。
答案 2 :(得分:0)
当然是按照这个顺序。这些文件不是按照算术顺序而是按照字典顺序。您必须将所有一位数字文件重命名为包含前导零以实现所需的顺序,或者编写自定义排序方法并将其应用于包含文件名的列表。