Saya ingin mendapatkan daftar file dalam direktori, tetapi saya ingin menyortirnya sehingga file terlama adalah yang pertama. Solusi saya adalah memanggil File.listFiles dan hanya menggunakan daftar berdasarkan File.lastModified, tapi saya bertanya-tanya apakah ada cara yang lebih baik.
Sunting: Solusi saya saat ini, seperti yang disarankan, adalah dengan menggunakan Pembanding anonim:
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.lastModified()
banyak sekali. Sebaiknya dapatkan semua tanggal terlebih dahulu dan pesan kemudian, sehinggafile.lastModified()
hanya dipanggil sekali per file.Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
Arrays.sort(files, Comparator.comparingLong(File::lastModified));
Jawaban:
Saya pikir solusi Anda adalah satu-satunya cara yang masuk akal. Satu-satunya cara untuk mendapatkan daftar file adalah dengan menggunakan File.listFiles () dan dokumentasi menyatakan bahwa ini tidak membuat jaminan tentang urutan file yang dikembalikan. Oleh karena itu Anda perlu menulis Comparator yang menggunakan File.lastModified () dan meneruskannya, bersama dengan array file, ke Arrays.sort () .
sumber
Ini mungkin lebih cepat jika Anda memiliki banyak file. Ini menggunakan pola menghias-sort-undecorate sehingga tanggal modifikasi terakhir dari setiap file diambil hanya sekali daripada setiap kali algoritma sortir membandingkan dua file. Ini berpotensi mengurangi jumlah panggilan I / O dari O (n log n) ke O (n).
Ini lebih banyak kode, jadi ini hanya boleh digunakan jika Anda terutama mementingkan kecepatan dan lebih cepat terukur dalam praktiknya (yang belum saya periksa).
sumber
Solusi elegan sejak Java 8:
Atau, jika Anda menginginkannya dalam urutan menurun, balikkan saja:
sumber
files.sort(Comparator.comparingLong(File::lastModified));
ArrayList<File> files = new ArrayList<File>(Arrays.asList(directory.listFiles()))
, itu tidak lebih mudah dari sekadarFile[] files = directory.listFiles()
.ArrayList<File>(...)
dalam komentar viniciussss diperlukan untuk mendapatkan daftar yang dapat diubah yang dapat diurutkan.) Saya menemukan utas ini mencari cara untuk mengurutkan daftar file. Jadi saya baru saja menambahkan kode itu sehingga orang hanya dapat menyalinnya jika mereka memiliki daftar juga.Comparator
kelas tidak memiliki metode panggilancomparingLong
Bagaimana dengan pendekatan yang serupa, tetapi tanpa tinju ke objek Panjang:
sumber
Anda juga dapat melihat apache commons IO , ia memiliki komparator modifikasi terakhir dan banyak utilitas bagus lainnya untuk bekerja dengan file.
sumber
Di Jawa 8:
Arrays.sort(files, (a, b) -> Long.compare(a.lastModified(), b.lastModified()));
sumber
Impor:
Apache Commons
Kode:
sumber
Jika file yang Anda sortir dapat dimodifikasi atau diperbarui pada saat yang sama, sortir dilakukan:
Java 8+
Java 7
Kedua solusi ini membuat struktur data peta sementara untuk menghemat waktu modifikasi terakhir konstan untuk setiap file dalam direktori. Alasan kami perlu melakukan ini adalah bahwa jika file Anda sedang diperbarui atau dimodifikasi saat pengurutan Anda dilakukan maka komparator Anda akan melanggar persyaratan transitivitas dari kontrak umum antarmuka komparator karena waktu modifikasi terakhir dapat berubah selama perbandingan.
Jika, di sisi lain, Anda tahu file tidak akan diperbarui atau diubah selama pengurutan Anda, Anda bisa lolos dengan cukup banyak jawaban lain yang dikirimkan ke pertanyaan ini, yang sebagian saya:
Java 8+ (Tidak ada modifikasi bersamaan saat penyortiran)
Catatan: Saya tahu Anda dapat menghindari terjemahan ke dan dari objek File dalam contoh di atas dengan menggunakan File :: getLastModifiedTime api dalam operasi aliran yang diurutkan, namun, maka Anda harus berurusan dengan pengecualian IO yang dicentang di dalam lambda Anda yang selalu menyusahkan. . Saya akan mengatakan jika kinerjanya cukup kritis sehingga terjemahannya tidak dapat diterima maka saya akan berurusan dengan IOException yang dicentang di lambda dengan menyebarkannya sebagai UncheckedIOException atau saya akan mengabaikan api File sama sekali dan hanya berurusan dengan objek File:
sumber
sumber
di mana
listFiles
koleksi semua file di ArrayListsumber
Anda dapat mencoba Pemesanan jambu biji :
sumber
Anda dapat menggunakan perpustakaan Apache LastModifiedFileComparator
sumber
sumber
Saya datang ke pos ini ketika saya mencari masalah yang sama tetapi di
android
. Saya tidak mengatakan ini adalah cara terbaik untuk mendapatkan file yang diurutkan berdasarkan tanggal modifikasi terakhir, tetapi ini adalah cara termudah yang saya temukan.Kode di bawah ini dapat membantu seseorang-
Terima kasih
sumber
for
lingkaran Anda dapat melihat saya telah mengambillist.length-1
uptoi >=0
yang hanya iterate Anda dalam urutan terbalik.Ada cara yang sangat mudah dan nyaman untuk menangani masalah tanpa pembanding tambahan. Hanya kode tanggal yang diubah ke dalam String dengan nama file, urutkan, dan kemudian lepas lagi.
Gunakan String dengan panjang tetap 20, masukkan tanggal yang dimodifikasi (panjang) ke dalamnya, dan isi dengan nol di depannya. Kemudian tambahkan saja nama file ke string ini:
Apa yang terjadi adalah ini di sini:
Nama file1: C: \ data \ file1.html Terakhir Dimodifikasi: 1532914451455 Dimodifikasi Terakhir 20 Digit: 00000001532914451455
Nama file1: C: \ data \ file2.html Terakhir Dimodifikasi: 1532918086822 Terakhir Dimodifikasi 20 Digit: 00000001532918086822
mengubah nama file menjadi:
Nama file1: 00000001532914451455C: \ data \ file1.html
Namafile2: 00000001532918086822C: \ data \ file2.html
Anda kemudian dapat mengurutkan daftar ini.
Yang perlu Anda lakukan adalah mengupas 20 karakter lagi nanti (di Java 8, Anda dapat menghapusnya untuk seluruh Array hanya dengan satu baris menggunakan fungsi .replaceAll)
sumber
Ada juga cara yang sama sekali berbeda yang mungkin lebih mudah, karena kita tidak berurusan dengan jumlah besar.
Alih-alih menyortir seluruh array setelah Anda mengambil semua nama file dan tanggal modifikasi terakhir, Anda bisa memasukkan setiap nama file saja setelah Anda mengambilnya di posisi yang tepat dari daftar.
Anda dapat melakukannya seperti ini:
Setelah Anda menambahkan object2 ke posisi 2, itu akan memindahkan object3 ke posisi 3.
sumber