디렉토리에 파일 목록을 가져오고 싶지만 가장 오래된 파일이 먼저 정렬되도록 정렬하고 싶습니다. 내 솔루션은 File.listFiles를 호출하고 File.lastModified를 기반으로 목록을 작성하는 것이었지만 더 나은 방법이 있는지 궁금했습니다.
편집 : 내 현재 솔루션은 제안 된대로 익명의 비교기를 사용하는 것입니다.
File[] files = directory.listFiles();
Arrays.sort(files, new Comparator<File>(){
public int compare(File f1, File f2)
{
return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
} });
답변
귀하의 솔루션이 합리적인 방법이라고 생각합니다. 파일 목록을 얻는 유일한 방법은 File.listFiles () 를 사용 하는 것이며 문서는 반환 된 파일의 순서를 보증하지 않습니다. 따라서 File.lastModified () 를 사용 하는 Comparator 를 작성하고 이를 파일 배열과 함께 Arrays.sort ()에 전달해야 합니다.
답변
파일이 많은 경우 더 빠를 수 있습니다. 이것은 sortate-sort-undecorate 패턴을 사용하므로 정렬 알고리즘이 두 파일을 비교할 때마다가 아니라 각 파일의 마지막 수정 날짜를 한 번만 가져옵니다 . 이는 잠재적으로 O (n log n)에서 O (n)으로의 I / O 호출 수를 줄입니다.
그러나 더 많은 코드이므로 속도에 주로 관심이 있고 실제로 확인하지 않은 경우 훨씬 빠릅니다.
class Pair implements Comparable {
public long t;
public File f;
public Pair(File file) {
f = file;
t = file.lastModified();
}
public int compareTo(Object o) {
long u = ((Pair) o).t;
return t < u ? -1 : t == u ? 0 : 1;
}
};
// Obtain the array of (file, timestamp) pairs.
File[] files = directory.listFiles();
Pair[] pairs = new Pair[files.length];
for (int i = 0; i < files.length; i++)
pairs[i] = new Pair(files[i]);
// Sort them by timestamp.
Arrays.sort(pairs);
// Take the sorted pairs and extract only the file part, discarding the timestamp.
for (int i = 0; i < files.length; i++)
files[i] = pairs[i].f;
답변
Java 8 이후의 우아한 솔루션 :
File[] files = directory.listFiles();
Arrays.sort(files, Comparator.comparingLong(File::lastModified));
또는 내림차순으로 원하면 뒤집으십시오.
File[] files = directory.listFiles();
Arrays.sort(files, Comparator.comparingLong(File::lastModified).reversed());
답변
비슷한 접근 방식에 관한 것이지만 Long 객체에는 권투가 없습니다.
File[] files = directory.listFiles();
Arrays.sort(files, new Comparator<File>() {
public int compare(File f1, File f2) {
return Long.compare(f1.lastModified(), f2.lastModified());
}
});
답변
또한 apache commons IO를 살펴볼 수 있으며 마지막으로 수정 된 비교기 와 파일 작업을위한 많은 다른 유용한 유틸리티가 있습니다.
답변
자바 8 :
Arrays.sort(files, (a, b) -> Long.compare(a.lastModified(), b.lastModified()));
답변
수입 :
org.apache.commons.io.comparator.LastModifiedFileComparator
코드 :
public static void main(String[] args) throws IOException {
File directory = new File(".");
// get just files, not directories
File[] files = directory.listFiles((FileFilter) FileFileFilter.FILE);
System.out.println("Default order");
displayFiles(files);
Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
System.out.println("\nLast Modified Ascending Order (LASTMODIFIED_COMPARATOR)");
displayFiles(files);
Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
System.out.println("\nLast Modified Descending Order (LASTMODIFIED_REVERSE)");
displayFiles(files);
}