2016-01-05 36 views
-1

我有两个目录作为最终文件列表的来源。这些文件被编号并需要在文件名的最后一个ArrayList中进行排序。形成来自两个不同文件夹的文件名的排序列表

dir1/file1 
dir1/file2 
dir2/file3 
dir1/file4 

如何基于文件名而不是目录对ArrayList进行排序?

+1

使用'Collections.sort()'并实现一个自定义的'Comparator'并传递给sort()方法。 – YoungHobbit

+0

文件名是否总是以数字结尾? – Bharatesh

+0

我正在收集来自不同图形过程的帧,所以这些文件被命名为frame000001.jpg – GianniTee

回答

3

为了更改排序顺序,您可以实现您自己的Comparator并使用它来更改默认顺序,使用Collections.sort(arrayList, c)
下面的示例文件名不考虑大小写字母顺序比较:

java.util.Comparator<String> c = new Comparator<String>() { 
    @Override 
    public int compare(String o1, String o2) { 
     String f1 = o1.substring(Math.max(0, o1.lastIndexOf("/")), o1.length()); 
     String f2 = o2.substring(Math.max(0, o2.lastIndexOf("/")), o2.length()); 
     return f1.compareToIgnoreCase(f2); 
    } 
}; 
Collections.sort(arrayList, c); 
+0

非常有趣。也许你可以缩短关键文件到文件名= filename.substring(filename.lastIndexOf('/')+ 1); – GianniTee

+0

如果我们按照从右到左的顺序进行排序会怎样?这个技巧会起作用吗? – GianniTee

+0

你是什么意思“从右到左排序”? –

1

这是不是一个真正的答案,只是除了Lee-Falcon's correct answer

比较器应该总是按照自然顺序排序(这对字符串是字典顺序的,对数字是上升的)。

一旦你实现你想要更改顺序,您只需更换

return value; 

return -1 * value; 

但我会建议使用反向比较

Integer[] ar = { 1, 3, 2, 4}; 
    Arrays.sort(ar); // sort with natural ordering 
    System.out.println(Arrays.toString(ar)); 
    Arrays.sort(ar, Collections.reverseOrder()); // sort with reverse ordering 
    System.out.println(Arrays.toString(ar)); 

Collections.reverseOrder()也接受比较器实例:

Arrays.sort(ar, Collections.reverseOrder(c)); 
相关问题