2012-05-07 37 views
4

如果我使用Android 2.2並在BookGenerator.java中調用File.list()方法,那麼頁面和章節按照確切的順序排列,但每當我在Android 4.0上執行時,反向頁面列表或反向頁面順序。File.list()以不同於4.0的順序返回文件的數量爲012

2.2和4.0之間是否存在兼容性問題?

+0

我很難理解您輸入的內容。你能讓它更清晰一點嗎? –

+1

@JasonRobinson你確定我是。你現在可以看看嗎 – Rizvan

+0

仍然很難。你是否在版本2.2和2.3中說過,某些數組是以特定的順序出現的,然後在4.0中以相反的順序出現? –

回答

5

你不應該在網頁的有序列表依靠listFiles():

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

「沒有保證所得數組中的名稱字符串會出現在任何特定的訂購;」

您必須根據文件名或lastModified或文件大小創建您自己的訂購系統。您可以使用比較器<文件>或比較器<字符串>對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(); 

如果你想更有效的一個,你必須實現在它的位置排序的數組你自己的方法。

0

使用一個Comparable來自己排序。

+0

你能解釋你的答案更具描述性嗎? – Rizvan

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

你能不能寫下你在這裏提到的排序方法,這對我更有幫助。 – Rizvan

+0

嗨,在這個例子中,我從你的代碼中摘錄了一段代碼。只需繼續並刪除reverseArray()方法,並用Collections.sort(章節)替換它的調用位置。它會工作。 – allprog

+0

你好,我現在就試試 – Rizvan

相關問題