如果我使用Android 2.2并在BookGenerator.java中调用File.list()
方法,那么页面和章节会按照确切的顺序排列,但每当我在Android 4.0上执行时,它都会给我反向页面列表或反向页面顺序
2.2和4.0之间是否存在兼容性问题?
答案 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自行排序。