2012-03-28 63 views
2

也许这已被回答之前,但我无法找到它。基本上这是问题。我有一个目录中的图像文件列表。它们从1-n开始编号,其中n-s大于10.在我的程序中,我创建一个指向文件所在目录的文件对象,然后在文件对象上调用“listFiles()”。它返回的文件,但按以下顺序:java在Windows操作系统上的File.listFiles()不符合逻辑顺序

 
filename1.jpg 
filename10.jpg 
filename11.jpg 
... 
filename2.jpg 
filename20.jpg 
filename21.jpg 
... 

这是操作系统报告这样的文件吗?我如何阻止它这样做?

+1

你为什么不直接用你自己的比较器对文件列表进行排序? – DRCB 2012-03-28 08:12:33

回答

4

的文件中明确规定

没有保证所得数组中的名称字符串会出现在任何特定的顺序;他们并不特别保证按字母顺序出现。

所以你应该根本不依靠这个。 '()listFiles'

Arrays.sort(Object[] object); 

Arrays.sort(T[] a, Comparator<? super T> c); 
+0

谢谢,我结束了你的建议。为什么MS OS以这种方式报告文件列表。有什么理由吗? – Gerrie 2012-03-29 06:54:21

+0

@Gerrie,“。”在ASCII表格中比任何数字都早,因此“1.jpg”比“10.jpg”更早出现, – yano 2013-11-22 00:00:32

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] 
+0

它是一个不错的主意,但生成文件的程序无法做到这一点。手动重命名文件是不可行的,因为它们太多了。 – Gerrie 2012-03-28 08:14:08

+0

好的,你可以实现一个合适的比较器并对其进行分类。 – Rekin 2012-03-28 08:16:24

+1

无论如何你必须对文件列表进行排序。此操作不会以任何顺序放置文件(请参阅Guillaume Polet的答案)。你怎么命名他们并不重要。 – DRCB 2012-03-28 08:17:37

3

只是使用java.util.Collections.sort(list, comparator)和实现自己的java.util.Comparator,如果你不喜欢它的排序方式。我认为这取决于操作系统如何在该阵列中对文件进行排序。

+0

'listFiles'返回一个数组而不是一个列表 – 2012-03-28 08:15:22

+0

@Guillaume Polet:从列表中取出列表并不是火箭科技。 Arrays.asList() – Korinna 2012-03-28 08:34:12

+0

@Korinna,当然,但你使用不必要的额外资源和操作,而数组提供了一种直接的数组排序方式。如果您不想影响调用代码,则需要将列表转换回数组。 – 2012-03-28 08:58:39

1

由于文档说:你可以,如果你想获得总是相同的顺序排序,使用

没有保证结果数组 中的名称字符串将以任何特定顺序出现;他们不是,特别是, 保证按字母顺序出现。

所以你可以将它们命名为Rekin说的,然后对这些文件名进行排序。