2013-05-16 24 views
3

我知道有很多類似的問題,因爲我的文件,但我還沒有與這些問題的答案(我覺得我失去了一些東西......)但不管怎麼說遠矣:排序鏈表<File>根據最後修改時間

我有一個LinkedList。在我的程序中,用戶應該能夠根據文件上次修改時間對列表進行排序。

我有例如試圖根據這兩個實現的東西:Finding the 3 most recently modified files in a long list of filesGet files in a directory sorted by last modified?在我的程序,但我似乎並沒有得到無論如何排序列表。

對於第一個鏈接:返回1,-1或0的處理是什麼?它實際上是否做了什麼,或者我應該添加一些代碼來將它在列表中向上或向下移動?

我想這些都是我應該使用的東西,對吧?我想知道如果這個代碼足夠了,還是我不得不添加一些東西來讓它工作?

注意:我想在現有的類中創建一個新的方法。

所以這是我試圖做的:

public static final Comparator<File> lastModified = new Comparator<File>() { 
    @Override 
    public int compare(File o1, File o2) { 
     return o1.lastModified() == o2.lastModified() ? 0 : (o1.lastModified() < o2.lastModified() ? 1 : -1); 
    } 
}; 
public void testFileSort() { 

    File[] file = new File(".").listFiles(); 
    Arrays.sort(file, lastModified); 
    //a snippet to actually update what the user sees 
} 

編輯 我最大的問題(?也許)是,當我的方法做,但它更新視圖,而不是在正確的道:「老字號」名單仍然是相同的,但在底部有那麼點不應該是...:

  • file1.jpg
  • file2.jpg
  • ...
  • ...
  • ...
  • imagelist.txt
  • SRC
  • 設置
  • 項目
  • 類路徑

(imagelist.txt是一個文本文件,其中的圖像epaths被存儲),出於某種原因,這是我在更新視圖後可以看到的列表。

編輯2 File [] file = new File(「。」)。listFiles();

輸出:[Ljava.io.File; @ 3e2a9a49 所以我想這應該是實際問題......?我想要做的是將我的LinkedList中的文件放到這個數組中,但我想我做錯了什麼,從第一個鏈接中得到了這個片段......如果這是在任何地方靠近正確的路要走。

預先感謝您,希望我的問題做了一些感覺和你們不要判斷我太多:) 我知道我做了這個現在很混亂...

+3

創建一個合適的比較器並將它傳遞給Collections.sort()。 http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort%28java.util.List,%20java.util.Comparator%29 –

+1

您已嘗試實施某人代碼,它不起作用?爲什麼不張貼一個最小工作示例,我們可以幫助解決出錯的地方。 – Pureferret

回答

3

的代碼在你的第一個鏈接足夠使用鏈接列表而不是文件數組。實際上比較是在比較器內部進行的。爲了使比較器具有通用性,只需知道下一個元素是大於還是小於等於。它不需要知道有關元素本身的任何細節。因此,在比較器函數中,您正在處理邏輯(最後修改時間較早或較早),並基於向比較器邏輯發送信息(使用1,-1或0)來讓它知道它比較大,較小或相等到比較元素。希望這是有道理的。

+0

非常感謝!我花了一段時間才明白,但它像夢一樣運作! – UserOrNotAnUser

0

整數值返回{1, -1, 0}當與對象比較意味着更大,更小和等於您正在比較的對象。它不會自己做任何事情,但是你知道如果一個更大,更小或等於另一個。

1

有一種方法file.lastModified(),它返回long。您可以根據此編寫自定義比較器。
像:

 @Override 
     public int compare(File o1, File o2) { 
      return o1.lastModified() > o2.lastModified() ? 1 : 0; 
     } 
+0

清潔解決方案:'return o1.lastModified() - o2.lastModified();'另請參閱:http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#compare% 28T,%20T%29 – wau

+0

有一件事我很想知道...... file.lastModified()返回一個long,但該方法應該返回一個int。所以 - 如果我將return語句轉換爲int類型,那麼方法會失敗。有沒有解決的辦法? – UserOrNotAnUser

+0

@UserOrNotAnUser'下轉換'使用...'長。parseInt(int foo)' – Pureferret

1

輸出:[Ljava.io.File; @ 3e2a9a49所以我想這將是實際問題...?

我對此表示懷疑!

輸出像[Ljava.io.File;@3e2a9a49只是表示您試圖在數組上打印調用toString()的結果。


對於第一個鏈接:什麼是返回1,-1或0的交易?它實際上是否做了什麼,或者我應該添加一些代碼來將它在列表中向上或向下移動?

的-1,0點,1是它告訴排序算法的第一個參數是否爲「小於」,「大於」,第二個參數「等於」,或。有關更多信息,請閱讀Comparator接口的javadoc。

不,您不應該在排序時移動元素。如果你在排序數組的時候這樣做,結果將是不可預測的。


這讓我爲難的事情是,爲什麼你覺得末這些文件不應該存在。您正在對目錄中的文件進行排序。如果這些文件在目錄中,那麼明顯是它們應該位於已排序的數組中,因此是視圖。如果它們不在目錄中,那麼最可能的問題是更新視圖的代碼...而不是您向我們展示的代碼。

+0

好吧,嗯....謝謝。 – UserOrNotAnUser

+0

是的,那可能是,現在已經修好了,你。 更新代碼是一個提供的代碼,它也更新其他方法中的所有視圖。 – UserOrNotAnUser