也许以前已经回答过,但我找不到它。基本上这就是问题所在。我有一个目录中的图像文件列表。它们从1-n编号,其中n -s大于10.在我的程序中,我创建一个指向文件所在目录的文件对象,然后在文件对象上调用“listFiles()”。它返回文件,但按以下顺序:
filename1.jpg filename10.jpg filename11.jpg ... filename2.jpg filename20.jpg filename21.jpg ...
这是操作系统报告这样的文件吗?我如何阻止它这样做?
答案 0 :(得分:4)
文件明确说明
无法保证结果数组中的名称字符串将以任何特定顺序出现;特别是,它们不保证按字母顺序出现。
所以你应该完全不依赖于此。如果您希望使用以下命令获得相同的订单,则可以对它们进行排序:
Arrays.sort(Object[] object);
或
Arrays.sort(T[] a, Comparator<? super T> c);
答案 1 :(得分:3)
如果您不喜欢它的排序方式,只需使用java.util.Collections.sort(list, comparator)
并实现您自己的java.util.Comparator
。我认为这取决于操作系统如何在该数组中对文件进行排序。
答案 2 :(得分:2)
好像没问题。尝试用前导零编号,即filename001.jpg。
确定,我的意思是操作系统按照字母顺序(技术上为ASCII字符代码)顺序返回它们。
编辑:正如其他人所指出的那样,最好的方法就是自己排序。这样您就不会依赖任何未指定的行为。我提供了一个如何使用正则表达式匹配的示例:import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
ArrayList<String> toSort = new ArrayList<String>(Arrays.asList(
new String[]{
"filename1.jpg",
"filename11.jpg",
"filename2.jpg",
"filename21.jpg",}));
System.out.println(toSort);
Collections.sort(toSort, new Comparator<String>() {
Pattern pat = Pattern.compile("filename(\\d+)\\.jpg");
public int compare(String a, String b) {
Matcher matA = pat.matcher(a);
Matcher matB = pat.matcher(b);
matA.find();
matB.find();
String ga = matA.group(1);
String gb = matB.group(1);
return Integer.valueOf(ga).compareTo(Integer.valueOf(gb));
}
});
System.out.println(toSort);
}
}
它返回:
[filename1.jpg, filename11.jpg, filename2.jpg, filename21.jpg]
[filename1.jpg, filename2.jpg, filename11.jpg, filename21.jpg]
答案 3 :(得分:1)
正如'listFiles()'文档所说:
无法保证结果数组中的名称字符串 将以任何特定顺序出现;特别是,它们不是 保证按字母顺序出现。
因此,您可以将它们命名为Rekin,然后对这些文件名进行排序。