Tidak ada implementasi yang ada di Bahasa Jawa dan Runtime. Semua Antrian memperpanjang AbstractQueue , dan dokumennya dengan jelas menyatakan bahwa menambahkan elemen ke antrian penuh selalu berakhir dengan pengecualian. Akan lebih baik (dan cukup sederhana) untuk membungkus Antrian ke dalam kelas Anda sendiri karena memiliki fungsi yang Anda butuhkan.
Sekali lagi, karena semua antrian adalah anak-anak dari AbstractQueue, cukup gunakan itu sebagai tipe data internal Anda dan Anda harus memiliki implementasi yang fleksibel berjalan dalam waktu yang hampir tidak ada :-)
MEMPERBARUI:
Seperti diuraikan di bawah ini, ada dua implementasi terbuka yang tersedia (jawaban ini cukup tua, kawan!), Lihat jawaban ini untuk perincian.
@ user7294900 Terima kasih, tautan diperbaiki. FYI, Stack Overflow mengundang Anda untuk mengedit sendiri langsung ke Jawaban. Siapa pun dapat mengedit, bukan hanya penulis asli. Stack Overflow dimaksudkan untuk lebih menyukai Wikipedia dalam hal itu.
Basil Bourque
@ BasilBourque ya, tetapi pengeditan tersebut dapat ditolak bahkan oleh saya ketika mengubah tautan itu adalah wilayah abu - abu
user7294900
18
Saya baru saja menerapkan antrian ukuran tetap dengan cara ini:
publicclassLimitedSizeQueue<K>extendsArrayList<K>{privateint maxSize;publicLimitedSizeQueue(int size){this.maxSize = size;}publicboolean add(K k){boolean r =super.add(k);if(size()> maxSize){
removeRange(0, size()- maxSize);}return r;}public K getYoungest(){return get(size()-1);}public K getOldest(){return get(0);}}
Saya setuju dengan Amhed di atas. Hapus - 1. Jika tidak pada kapasitas maks Anda akan berakhir dengan array yang maxSize + 1 karena kita berbicara tentang 0 berbasis. Misalnya. Jika maxSize = 50 maka ketika menambahkan objek baru, formula removeRange dalam postingan asli akan menjadi 51 - 50 - 1 = 0 (mis. Tidak ada yang dihapus).
Etep
8
Inilah yang saya lakukan dengan Queuedibungkus LinkedList, Ini adalah ukuran tetap yang saya berikan di sini adalah 2;
publicstaticQueue<String> pageQueue;
pageQueue =newLinkedList<String>(){privatestaticfinallong serialVersionUID =-6707803882461262867L;publicboolean add(String object){boolean result;if(this.size()<2)
result =super.add(object);else{super.removeFirst();
result =super.add(object);}return result;}};....TMarket.pageQueue.add("ScreenOne");....TMarket.pageQueue.add("ScreenTwo");.....
Kelas ini melakukan pekerjaan menggunakan komposisi alih-alih pewarisan (jawaban lain di sini) yang menghilangkan kemungkinan efek samping tertentu (seperti yang dicakup oleh Josh Bloch di Essential Java). Pemangkasan LinkedList yang mendasari terjadi pada metode add, addAll dan offer.
Tidak jelas persyaratan apa yang Anda miliki yang membuat Anda mengajukan pertanyaan ini. Jika Anda membutuhkan struktur data ukuran tetap, Anda mungkin juga ingin melihat kebijakan caching yang berbeda. Namun, karena Anda memiliki antrian, tebakan terbaik saya adalah Anda mencari beberapa jenis fungsi router. Dalam hal ini, saya akan menggunakan buffer cincin: array yang memiliki indeks pertama dan terakhir. Setiap kali elemen ditambahkan, Anda hanya menambah indeks elemen terakhir, dan ketika elemen dihapus, tambah indeks elemen pertama. Dalam kedua kasus, penambahan dilakukan modulo ukuran array, dan pastikan untuk menambah indeks lain saat diperlukan, yaitu, ketika antrian penuh atau kosong.
Selain itu, jika ini adalah aplikasi tipe router, Anda mungkin juga ingin bereksperimen dengan algoritma seperti Random Early Dropping (RED), yang menjatuhkan elemen dari antrian secara acak bahkan sebelum terisi. Dalam beberapa kasus, RED telah ditemukan memiliki kinerja keseluruhan yang lebih baik daripada metode sederhana yang memungkinkan antrian untuk diisi sebelum jatuh.
Jawaban:
Tidak ada implementasi yang ada di Bahasa Jawa dan Runtime. Semua Antrian memperpanjang AbstractQueue , dan dokumennya dengan jelas menyatakan bahwa menambahkan elemen ke antrian penuh selalu berakhir dengan pengecualian. Akan lebih baik (dan cukup sederhana) untuk membungkus Antrian ke dalam kelas Anda sendiri karena memiliki fungsi yang Anda butuhkan.
Sekali lagi, karena semua antrian adalah anak-anak dari AbstractQueue, cukup gunakan itu sebagai tipe data internal Anda dan Anda harus memiliki implementasi yang fleksibel berjalan dalam waktu yang hampir tidak ada :-)
MEMPERBARUI:
Seperti diuraikan di bawah ini, ada dua implementasi terbuka yang tersedia (jawaban ini cukup tua, kawan!), Lihat jawaban ini untuk perincian.
sumber
collection.deque
dengan yang ditentukanmaxlen
.Sebenarnya LinkedHashMap melakukan apa yang Anda inginkan. Anda perlu mengganti
removeEldestEntry
metode.Contoh untuk antrian dengan maksimal 10 elemen:
Jika "removeEldestEntry" mengembalikan true, entri tertua dihapus dari peta.
sumber
Ya dua
Dari pertanyaan rangkap saya sendiri dengan jawaban yang benar ini , saya belajar dua:
EvictingQueue
di Google GuavaCircularFifoQueue
di Apache CommonsSaya memanfaatkan Jambu secara produktif
EvictingQueue
, bekerja dengan baik.Untuk membuat instance
EvictingQueue
panggilan metode pabrik statiscreate
dan tentukan ukuran maksimum Anda.sumber
CircularFifoQueue
tautan sudah mati, gunakan sebaliknya commons.apache.org/proper/commons-collections/apidocs/org/…Saya baru saja menerapkan antrian ukuran tetap dengan cara ini:
sumber
removeRange(0, size() - maxSize)
Inilah yang saya lakukan dengan
Queue
dibungkusLinkedList
, Ini adalah ukuran tetap yang saya berikan di sini adalah 2;sumber
Saya pikir apa yang Anda gambarkan adalah antrian melingkar. Berikut adalah contoh dan di sini adalah lebih baik satu
sumber
Kelas ini melakukan pekerjaan menggunakan komposisi alih-alih pewarisan (jawaban lain di sini) yang menghilangkan kemungkinan efek samping tertentu (seperti yang dicakup oleh Josh Bloch di Essential Java). Pemangkasan LinkedList yang mendasari terjadi pada metode add, addAll dan offer.
sumber
Penggunaan dan hasil tes:
sumber
Kedengarannya seperti Daftar biasa di mana metode add berisi potongan tambahan yang memotong daftar jika terlalu lama.
Jika itu terlalu sederhana, maka Anda mungkin perlu mengedit deskripsi masalah Anda.
sumber
Lihat juga pertanyaan SO ini , atau ArrayBlockingQueue (hati-hati tentang pemblokiran, ini mungkin tidak diinginkan dalam kasus Anda).
sumber
Tidak jelas persyaratan apa yang Anda miliki yang membuat Anda mengajukan pertanyaan ini. Jika Anda membutuhkan struktur data ukuran tetap, Anda mungkin juga ingin melihat kebijakan caching yang berbeda. Namun, karena Anda memiliki antrian, tebakan terbaik saya adalah Anda mencari beberapa jenis fungsi router. Dalam hal ini, saya akan menggunakan buffer cincin: array yang memiliki indeks pertama dan terakhir. Setiap kali elemen ditambahkan, Anda hanya menambah indeks elemen terakhir, dan ketika elemen dihapus, tambah indeks elemen pertama. Dalam kedua kasus, penambahan dilakukan modulo ukuran array, dan pastikan untuk menambah indeks lain saat diperlukan, yaitu, ketika antrian penuh atau kosong.
Selain itu, jika ini adalah aplikasi tipe router, Anda mungkin juga ingin bereksperimen dengan algoritma seperti Random Early Dropping (RED), yang menjatuhkan elemen dari antrian secara acak bahkan sebelum terisi. Dalam beberapa kasus, RED telah ditemukan memiliki kinerja keseluruhan yang lebih baik daripada metode sederhana yang memungkinkan antrian untuk diisi sebelum jatuh.
sumber
Sebenarnya Anda dapat menulis impl Anda sendiri berdasarkan LinkedList, itu sangat mudah, hanya menimpa metode add dan melakukan staf.
sumber
Saya pikir jawaban yang paling cocok adalah dari pertanyaan lain ini .
Koleksi Apache commons 4 memiliki CircularFifoQueue yang merupakan apa yang Anda cari. Mengutip javadoc:
sumber
Solusi sederhana, di bawah ini adalah Antrian "String"
Perhatikan bahwa ini tidak akan mempertahankan Urutan item dalam Antrian, tetapi itu akan menggantikan entri tertua.
sumber
Seperti yang disarankan dalam OOP bahwa kita harus lebih memilih Komposisi daripada Warisan
Di sini solusi saya mengingatnya.
sumber