File.list()以不同于2.5的顺序返回文件

时间:2012-05-07 05:22:53

标签: java android android-webview android-2.2-froyo android-4.0-ice-cream-sandwich

如果我使用Android 2.2并在BookGenerator.java中调用File.list()方法,那么页面和章节会按照确切的顺序排列,但每当我在Android 4.0上执行时,它都会给我反向页面列表或反向页面顺序

2.2和4.0之间是否存在兼容性问题?

3 个答案:

答案 0 :(得分:5)

您不应该依赖listFiles()来获取页面的有序列表:

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/File.html#listFiles()

“无法保证结果数组中的名称字符串将以任何特定顺序出现;”

您必须根据文件名或lastModified或文件大小创建自己的订购系统。你可以使用Comparator<文件>或比较器<字符串>对于排序SortedSet中的文件,或者如前所述,为要实现Comparable的排序项创建一个自己的类。我建议使用第一个解决方案,因为将File或String类包装到另一个中只是为了这个功能有点愚蠢。

一个内存开销很大的例子:

TreeSet<File> pages = new TreeSet<File>(new Comparator<File>(){
   public int compare(File first, File second) {
      return first.getName().compareTo(second.getName());
   }
});

for (File file : allFiles) {
   pages.add(file());
}

allFiles = pages.toArray();

如果你想要一个更有效的方法,你必须实现自己的方法来排列数组。

答案 1 :(得分:3)

list()方法不保证项目的任何特定订单。 Android文档缺乏这一点,但官方Java SE API javadoc警告它:

  

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

在使用之前,您应该使用Collections.sort()对数组进行排序。

File fChapters = new File(internalStorage + bookName + "/Chapters");
// Obtain the chapters file names list (the files in the directory)
chapters = fChapters.list();
// Sort the file names according to default alphabetic ordering
Collections.sort(chapters)
// The chapters list is now sorted from A to Z

使用此方法的sort(List list, Comparator c)重载,您可以定义所需的任何顺序。例如,忽略标题中字母的大小写:

Collections.sort(chapters, new Comparator<String>() {
    @Override
    public int compare(String chapter1, String chapter2) {
        return chapter1.compareToIgnoreCase(chapter2);
    }
});

答案 2 :(得分:0)

使用Comparable自行排序。