2015-11-27 20 views
-1

Я хочу сортировать массив файлов по lastModefiedTime от самого старого до самого нового (первый элемент должен быть самым старым и последним элементом самого нового).Сортировка массивов файлов по LastModefiedTime

Я написал этот метод, но он не работал!

private static void swap(File[] files,int a, int b){ 
    File h = files[a]; 
    files[a]=files[b]; 
    files[b]=h; 
} 

public static void fillBoxList(String path){ 



    File dir = new File(path); 
    File[] files = dir.listFiles(); 

    if (files != null) { 

     //Box.addToFilesArray(directoryListing[0]); 
// print the List before Sorting 
     for(int i =0;i<dfiles.length;i++){ 
      Log.i("LastModDate", new Date(directoryListing[i].lastModified())+""); 
     } 
//Beginn of Sorting 
     for (int i =1;i<files.length;i++) { 

      Date lastModdate1 = new Date(files[i-1].lastModified()); 
      Date lastModDate2 = new Date(files[i].lastModified()); 

       if(lastModdate1.compareTo(lastModDate2)>1){ 
        swap(files,i-1,i); 
       } 
     } 
// print the List after Sorting 
     for(int i =0;i<directoryListing.length;i++){ 
      Log.i("SortedLastModDate", new Date(directoryListing[i].lastModified())+""); 
     } 
    } else { 

     Log.e("DircError","directory dont exists"); 
    } 
} 

не могли бы вы рассказать мне, пожалуйста, что я сделал не так?

+1

Как насчет преобразования массива в «Список», а затем сортировки списка в однострочном пространстве с использованием Java 8 Lambda? https://dzone.com/articles/using-lambda-expression-sort – Magnilex

+0

Я действительно не знаю Лямбду, я никогда не использовал его! – user3232446

ответ

1

Ваш алгоритм сортировки на самом деле не так. Там должно быть две петли в Bubble sort

while (true){ 
    boolean swapped = false; 
    for (int i =1;i<files.length;i++) { 
     Date lastModdate1 = new Date(files[i-1].lastModified()); 
     Date lastModDate2 = new Date(files[i].lastModified()); 
     if(lastModdate1.compareTo(lastModDate2)>1){ 
       swap(files,i-1,i); 
       swapped = true; 
     } 
    } 
    if (!swapped) 
     break; 
} 
+0

Я попробовал ваше решение. когда я сделал это с lastModdate1.compareTo (lastModDate2)> 1, я получил самый новый как первый элемент. поэтому я меняю его на lastModdate1.compareTo (lastModDate2) <1, и я получил бесконечный цикл! – user3232446

+0

'lastModdate1.compareTo (lastModDate2) <1' приведет к бесконечному циклу, если в списке есть два элемента. используйте: 'lastModdate1.compareTo (lastModDate2) <0' – Tempux

+0

и что я должен делать в этом случае? – user3232446

0

Я предлагаю вам сначала проверить, что значение заявления Comparision возвращающиеся

int comparison = date.compareTo(date2); 

INT comparison2 = date2.compareTo (дата); int compare3 = date.compareTo (дата);

Log те Int переменных, а затем проверить, как сортировать, или может быть ваша дата не отформатирован

0

Вы можете использовать Java 8 подход:

public static void main(String[] args) throws IOException { 
    Stream<File> sortedFiles = getSortedFiles("src/main/resources"); 
    sortedFiles.forEach(f -> 
     System.out.printf("File: %s, last modified %s \n", f.getName(), new Date(f.lastModified())) 
    ); 
} 

public static Stream<File> getSortedFiles(String path) throws IOException { 
    List<File> files = new ArrayList<>(); 
    try (Stream<Path> list = Files.list(Paths.get(path))) { 
     list.map(Path::toFile) 
       .sorted(Comparator.comparing(File::lastModified)) 
       .forEach(files::add); 
    } 
    return files.stream(); 
} 
+0

мы используем java 7 для нашего проекта – user3232446

-1

вы могли бы написать java.util.Comparator, который сравнивает LastModefiedTime и чем сортировать массив с java.utils.Arrays.sort(T[] a, Comparator<? super T> c)). Вам не нужно выполнять сортировку самостоятельно.

Смежные вопросы