如果我使用的是 Android 2.2 并在BookGenerator.javaFile.list()
中调用方法,则页面和章节的顺序完全相同,但每当我在 Android 4.0 上执行时,它都会给我反向页面列表或反向页面顺序。
2.2 和 4.0 之间是否存在兼容性问题?
如果我使用的是 Android 2.2 并在BookGenerator.javaFile.list()
中调用方法,则页面和章节的顺序完全相同,但每当我在 Android 4.0 上执行时,它都会给我反向页面列表或反向页面顺序。
2.2 和 4.0 之间是否存在兼容性问题?
您不应该依赖 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();
如果您想要一个更有效的方法,您必须实现自己的方法来对数组进行排序。
该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);
}
});
使用 Comparable 自行排序。