【问题标题】:File.list() returns files in a different order for 4.0 than 2.2File.list() 以与 4.0 和 2.2 不同的顺序返回文件
【发布时间】:2012-05-07 05:22:53
【问题描述】:

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

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

【问题讨论】:

  • 我很难理解您输入的内容。你能让它更清晰一点吗?
  • @JasonRobinson 你确定我愿意。你现在可以看看吗
  • 仍然很难。您是说在 2.2 和 2.3 版本中,某些数组以特定顺序出现,然后在 4.0 中以相反顺序出现?
  • 我想我明白了。 list() 方法在 2.2 和 2.3 中以一种顺序返回您的文件,而在 4.0 中,它与您在 2.2 和 2.3 中获得的相反。这是正确的吗?
  • @JasonRobinson 是你的仪式吗?有什么解决办法吗?

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    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);
        }
    });
    

    【讨论】:

    • 你能不能把你这里提到的排序方法写下来,对我更有帮助。
    • 嗨,在示例中,我从您的代码中获取了 sn-p。继续删除 reverseArray() 方法,并用 Collections.sort(chapters) 替换它的调用位置。它会起作用的。
    【解决方案3】:

    使用 Comparable 自行排序。

    【讨论】:

    • 你能解释一下你的答案更具描述性吗?
    猜你喜欢
    • 2020-06-07
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多