2017-03-17 38 views
3

我想在我的Java項目中使用Lambda表達式。我的代碼從一個文件夾讀取文件,將它們存儲在一個數組中,並按降序排列它們。其他方法將使用此代碼來獲取包含最近日期的文件。在Lambda表達式中使用if語句對數組進行排序

Arrays.sort(listOfFiles, (File file1, File file2) -> file2.getName().compareToIgnoreCase(file1.getName())); 

的輸出是:

README.txt 
forecast-project-export-from-2017-03-06-to-2017-03-10.csv 
forecast-project-export-from-2017-02-27-to-2017-03-03.csv 
forecast-project-export-from-2017-02-20-to-2017-02-24.csv 
forecast-project-export-from-2017-02-13-to-2017-02-17.csv 
forecast-project-export-from-2017-02-06-to-2017-02-10.csv 
forecast-project-export-from-2017-01-30-to-2017-02-03.csv 
forecast-project-export-from-2017-01-23-to-2017-01-27.csv 

的輸出是正確然而,該文件夾包含欲忽略或不具有它作爲數組的[0]元素的README.txt文件。有沒有一種方法可以使用if語句,該語句僅在元素名稱包含「forecast-project-export-from」時對元素進行排序。事情是這樣的:

if (o1.getName().contains("forecast-project-export-from") && o2.getName().contains("forecast-project-export-from")) { 
    return o2.getName().compareToIgnoreCase(o1.getName()); 
} 
+1

您可以使用if,但這不會幫助您處理文件。你需要從實際輸入中刪除你的文件。您可以使用流來排序它:'tmp.stream()。filter(x - > x.startsWith(「my-prefix」))。sorted((k1,k2) - > k1.compareTo(k2)) .collect(Collectors.toList());' – pandaadb

+0

我認爲你可以過濾你的listOfFiles去除未使用的文件,然後對列表進行排序。 –

+0

,儘管你提到排除'README.txt'文件,這聽起來像你真正想要做的只是_include_文件匹配模式'預測 - 項目 - 出口 - 從 - - 到 .csv'。目前唯一的問題文件是'README.txt',但是如果你只排除那個文件,那麼如果另一個「壞」文件被添加到文件夾中,你的代碼可能會再次破壞。所以,給出的「過濾器」示例是一個很好的起點,但我會爲所需的文件做一個包容性過濾器,而不是當前已知的文件的排他性。 – lukens

回答

2

改變一個Comparator爲此目的可以工作,如果您滿意將read-me存儲爲數組中的最後一個值。

(File file1, File file2) -> { 
    if(file1.getName().equals("README.txt")) 
     return 1; //readme-file is always "greater" than other files 
    if(file2.getName().equals("README.txt")) 
     return -1; 
    else 
     return file2.getName().compareToIgnoreCase(file1.getName())); 
}; 

相關jls-section

如果你想不過來消除README文件,你必須篩選出來(我們都愛Java8,所以這裏的流版本):

File[] sorted = Arrays.stream(listOfFiles).filter(f->!f.getName().equals("README.txt")). 
    sort(Comparator.comparing(File::getName, String::compareToIgnoreCase)). 
    toArray(File[]::new); 
+0

您的流示例不會生成只有一個自述文件的流嗎? – Sylwester

+0

@Sylwester sry,我的壞。我會糾正這一點。感謝您指出:) – Paul

+0

不應該''.sorted(Comparator.comparing(File :: getName)'' – pratikpncl

1

排序數組不足以擺脫的README.txt,你將需要排序,你需要經過過濾

List<File> result = Arrays.asStream(listOfFiles)    
    .filter(x -> !"readme.txt".equalsIgnoreCase(x.getName())) 
    .collect(Collectors.toList());   

result.forEach(System.out::println); 
2

在排序過程中從集合中刪除元素是不可能的。

File.listFiles(f -> f.getName().equals("README.txt")); 

順便說一句:

文件夾中列出的文件時,您現在可以提供的FileFilter作爲lambda表達式通過使用提取排序元素的方式更優雅(恕我直言):

listOfFiles.sort(Comparator.comparing(File::getName)); 
相關問題