Sebuah pertanyaan yang sangat sederhana & cepat di perpustakaan Java: apakah ada kelas yang sudah jadi yang mengimplementasikan a Queue
dengan ukuran maksimum tetap - yaitu selalu memungkinkan penambahan elemen, tetapi akan secara diam-diam menghapus elemen kepala untuk mengakomodasi ruang untuk elemen yang baru ditambahkan.
Tentu saja, sangat mudah untuk mengimplementasikannya secara manual:
import java.util.LinkedList;
public class LimitedQueue<E> extends LinkedList<E> {
private int limit;
public LimitedQueue(int limit) {
this.limit = limit;
}
@Override
public boolean add(E o) {
super.add(o);
while (size() > limit) { super.remove(); }
return true;
}
}
Sejauh yang saya lihat, tidak ada implementasi standar di stdlibs Java, tetapi mungkin ada satu di Apache Commons atau sesuatu seperti itu?
collections
queue
java
GreyCat
sumber
sumber
Jawaban:
Koleksi Apache commons 4 memiliki CircularFifoQueue <> yang Anda cari. Mengutip javadoc:
Jika Anda menggunakan versi yang lebih lama dari koleksi Apache commons (3.x), Anda dapat menggunakan CircularFifoBuffer yang pada dasarnya adalah hal yang sama tanpa obat generik.
Pembaruan : jawaban yang diperbarui setelah rilis koleksi commons versi 4 yang mendukung obat generik.
sumber
EvictingQueue
ditambahkan ke Google Guava versi 15 sekitar 2013-10.Guava sekarang memiliki EvictingQueue , antrian non-pemblokiran yang secara otomatis mengusir elemen dari kepala antrian ketika mencoba untuk menambahkan elemen baru ke dalam antrian dan penuh.
sumber
EvictingQueue
adalah FIFO. Jika ada keraguan, coba program ini:Queue<Integer> fifo = EvictingQueue.create(2); fifo.add(1); fifo.add(2); fifo.add(3); System.out.println(fifo);
Amati hasilnya:[2, 3]
Saya suka solusi @FractalizeR. Tapi saya juga akan menyimpan dan mengembalikan nilai dari super.add (o)!
sumber
LinkedList
tidak aman utas juga tidak akan ada gunanya. dalam konteks pertanyaan ini, persyaratan khusus OP membuatnya sangat penting bahwa menambahkan item dilakukan sebagai operasi atom. dengan kata lain, risiko tidak memastikan atomisitas akan lebih besar daripada dalam kasus LinkedList biasa.add(int,E)
. Dan apakahaddAll
berfungsi sebagaimana dimaksud, tergantung pada detail implementasi yang tidak ditentukan. Itu sebabnya Anda harus memilih delegasi daripada warisan ...Gunakan komposisi tidak meluas (ya maksudku meluas, seperti dalam referensi ke kata kunci meluas di java dan ya ini adalah warisan). Komposisi lebih unggul karena sepenuhnya melindungi implementasi Anda, memungkinkan Anda untuk mengubah implementasi tanpa berdampak pada pengguna kelas Anda.
Saya sarankan mencoba sesuatu seperti ini (saya mengetik langsung ke jendela ini, jadi pembeli waspada terhadap kesalahan sintaksis):
Opsi yang lebih baik (berdasarkan jawaban oleh Asaf) mungkin untuk membungkus Apache Collections CircularFifoBuffer dengan kelas generik. Sebagai contoh:
sumber
LinkedList
diimplementasikan, lalu. Objek tambahan yang dibuat sebagai pembungkus di sekitar daftar akan sangat kecil, bahkan dengan "puluhan juta" instance.Satu-satunya hal yang saya tahu yang memiliki ruang terbatas adalah antarmuka BlockingQueue (yang misalnya diimplementasikan oleh kelas ArrayBlockingQueue) - tetapi mereka tidak menghapus elemen pertama jika diisi, tetapi sebaliknya memblokir operasi put sampai ruang bebas (dihapus oleh utas lainnya) ).
Sepengetahuan saya implementasi sepele Anda adalah cara termudah untuk mendapatkan perilaku seperti itu.
sumber
BlockingQueue
bukan jawaban. Saya sudah memikirkan perpustakaan umum lainnya, seperti Apache Commons, perpustakaan Eclipse, Spring, tambahan Google, dll?Anda dapat menggunakan MinMaxPriorityQueue dari Google Guava , dari javadoc:
sumber
Map
berperilaku sepertiList
. Namun kedua ide tersebut menunjukkan tidak lengkapnya algoritma dan desain perangkat lunak.MinMaxPriorityQueue
menjadi apa yang diinginkan OP lebih sepele daripada memodifikasiLinkedList
(kode OP bahkan tidak mendekati).long
sebagai jenis kursor dalam saran saya sendiri, mengatakan bahwa itu akan cukup luas dalam prakteknya meskipun secara teoritis Anda dapat menambahkan lebih dari 2 ^ 64 objek ke antrian ini di mana titik solusi akan rusak .LRUMap adalah kemungkinan lain, juga dari Apache Commons.
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/LRUMap.html
sumber
sumber