4

如果我使用的是 Android 2.2 并在BookGenerator.javaFile.list()中调用方法,则页面和章节的顺序完全相同,但每当我在 Android 4.0 上执行时,它都会给我反向页面列表或反向页面顺序。

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

4

3 回答 3

5

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

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

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

您必须根据文件名或 lastModified 或文件大小创建自己的排序系统。您可以使用 Comparator < File > 或 Comparator < String > 对 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();

如果您想要一个更有效的方法,您必须实现自己的方法来对数组进行排序。

于 2012-05-07T06:06:27.720 回答
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);
    }
});
于 2012-05-07T06:19:44.153 回答
0

使用 Comparable 自行排序。

于 2012-05-07T06:00:16.143 回答