2013-05-16 3 views
3

Я знаю, что есть много похожих вопросов, как у меня, но я не получил ни одного ответа с этими ответами (я чувствую, что мне что-то не хватает ...) Но в любом случае:Сортировка LinkedList <File> в соответствии с файлами Последнее изменение времени

У меня есть LinkedList. В моей программе пользователь должен иметь возможность сортировать список в соответствии с последним измененным временем файлов.

Я, например, попытался реализовать что-то в соответствии с этими двумя: Finding the 3 most recently modified files in a long list of files и Get files in a directory sorted by last modified? в моей программе, но, похоже, я все равно не сортировал список.

Для первой ссылки: какая сделка с возвратом 1, -1 или 0? Делает ли это на самом деле что-либо, или я должен добавить код, чтобы переместить его вверх или вниз по списку?

Я думаю, что любой из них - это то, что я должен использовать, правильно? Мне было интересно, достаточно ли этого кода, или мне нужно добавить что-то еще, чтобы заставить его работать?

NB. Я хотел бы создать новый метод в существующем классе.

Так вот то, что я пытался сделать:

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
  • бин
  • ЦСИ
  • настройки
  • проект
  • классам

(imagelist.txt это текстовый файл, в котором epaths), по какой-то причине это список, который я вижу после обновления представления.

EDIT 2 Файл [] file = new Файл ("."). ListFiles();

Выход: [Ljava.io.File; @ 3e2a9a49 Так что, я думаю, это была бы АКТУАЛЬНАЯ проблема ...? То, что я пытался сделать, это поместить файлы из моего LinkedList в этот массив, но я думаю, что я сделал что-то не так, получил этот фрагмент из первой ссылки ... Каким будет подходящий способ сделать это, если это где угодно недалеко от надлежащего пути.

Заранее спасибо, надеюсь, что мой вопрос сделал какой-то смысл, и вы, ребята, не судите меня слишком много :) Я знаю, что я сделал это совершенно сбивает с толку теперь ...

+3

создать соответствующий 'Comparator' и передать его в' 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, метод kinda не выполняется. Есть ли способ обойти это? – UserOrNotAnUser

+0

@UserOrNotAnUser to 'down convert' use ... 'Long.parseInt (int foo) ' – Pureferret

1

Выход: [Ljava.io.File; @ 3e2a9a49 Так что я думаю, что это будет АКТУАЛЬНО проблема ...?

Я сомневаюсь в этом!

Вывод, как [Ljava.io.File;@3e2a9a49, просто означает, что вы попытались напечатать результат вызова toString() на массиве.


Для первого звена: в чем дело с возвратом 1, -1 или 0? Делает ли это на самом деле что-либо, или я должен добавить код, чтобы переместить его вверх или вниз по списку?

Точка -1, 0, +1, что говорит алгоритм сортировки является ли первый аргумент «меньше чем», «равно» или «больше чем» второго аргумента. Для получения дополнительной информации прочтите javadocs для интерфейса Comparator.

Нет, вы не должны перемещать элементы во время сортировки. Если вы это сделаете при сортировке массива, результаты будут непредсказуемыми.


Дело в том, что озадачивает меня почему вы думаете эти файлы в конце не должно быть. Вы сортируете файлы в каталоге. Если эти файлы находятся в каталоге, то явно они должны быть в отсортированном массиве и, следовательно, в представлении. Если они не находятся в каталоге, то наиболее вероятной проблемой является код, который обновляет представление ... не тот код, который вы нам показали.

+0

Хорошо, хм .... Спасибо. – UserOrNotAnUser

+0

Да, возможно, это исправлено, ты. Код обновления был предоставленным кодом, который также обновляет все представления в других методах. – UserOrNotAnUser