也许这个答案以前,但我无法find它。 基本上这是问题。 我有一个目录中的图像文件列表。 它们从1-n开始编号,其中n-s大于10.在我的程序中,我创build一个指向文件所在目录的文件对象,然后在文件对象上调用“listFiles()”。 它返回这些文件,但按以下顺序:
filename1.jpg filename10.jpg filename11.jpg ... filename2.jpg filename20.jpg filename21.jpg ...
这是操作系统报告这样的文件? 我如何阻止它做到这一点?
文件明确指出
不能保证结果数组中的名称字符串将以任何特定顺序出现; 他们并不特别保证按字母顺序出现。
所以你应该不要依赖这个。 如果你想要得到相同的订单,你可以对它们进行排序,使用:
Arrays.sort(Object[] object);
要么
Arrays.sort(T[] a, Comparator<? super T> c);
只要使用java.util.Collections.sort(list, comparator)
并且实现你自己的java.util.Comparator
如果你不喜欢它的排序方式)。 我认为这取决于操作系统如何在这个数组中排序文件。
这似乎没问题。 尝试使用前导零来编号,即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]
由于“listFiles()”文档说:
不能保证结果数组中的名称字符串将以任何特定顺序出现; 他们并不特别保证按字母顺序出现。
所以你可以把它们命名为Rekin说,然后对这些文件名进行排序。