Saya perlu menambahkan elemen ke ArrayList
antrian apa pun, tetapi ketika saya memanggil fungsi untuk menambahkan elemen, saya ingin menambahkan elemen di awal array (sehingga memiliki indeks terendah) dan jika array memiliki 10 elemen menambahkan hasil baru dalam menghapus elemen tertua (yang dengan indeks tertinggi).
Adakah yang punya saran?
remove
danadd
?arraylist stack queue whatever
untuk menambah awal array sebaiknya dihindari dan sepertinya Anda harus menggunakan koleksi yang berbeda.Jawaban:
List
memiliki metodeadd(int, E)
, sehingga Anda dapat menggunakan:Setelah itu Anda dapat menghapus elemen terakhir dengan:
Namun, Anda mungkin ingin memikirkan kembali kebutuhan Anda atau menggunakan struktur data yang berbeda, seperti a
Queue
EDIT
Mungkin lihat di Apache
CircularFifoQueue
:Inisialisasi dengan ukuran maksimum Anda:
sumber
Menggunakan Struktur Data Tertentu
Ada berbagai struktur data yang dioptimalkan untuk menambahkan elemen pada indeks pertama. Namun perlu diingat, bahwa jika Anda mengonversi koleksi Anda ke salah satu dari ini, percakapan mungkin akan membutuhkan kompleksitas ruang dan waktu
O(n)
Deque
JDK termasuk
Deque
struktur yang menawarkan metode sepertiaddFirst(e)
danofferFirst(e)
Analisis
Kompleksitas ruang dan waktu penyisipan adalah dengan
LinkedList
konstan (O(1)
). Lihat lembar contekan Big-O .Membalikkan Daftar
Metode yang sangat mudah tetapi tidak efisien adalah dengan menggunakan terbalik:
Jika Anda menggunakan aliran Java 8, jawaban ini mungkin menarik bagi Anda.
Analisis
O(n)
O(1)
Melihat implementasi JDK ini memiliki
O(n)
kompleksitas waktu sehingga hanya cocok untuk daftar yang sangat kecil.sumber
Anda dapat melihat pada add (indeks int, elemen E) :
Setelah Anda menambahkan, Anda dapat memeriksa ukuran ArrayList dan menghapus yang di akhir.
sumber
Anda mungkin ingin melihat Deque. itu memberi Anda akses langsung ke item pertama dan terakhir dalam daftar.
sumber
Apa yang Anda gambarkan, adalah situasi yang tepat untuk digunakan
Queue
.Karena Anda ingin
add
elemen baru, danremove
yang lama. Anda dapat menambahkan di akhir, dan menghapus dari awal. Itu tidak akan membuat banyak perbedaan.Antrian memiliki metode
add(e)
danremove()
yang menambahkan pada akhirnya elemen baru, dan menghapus dari awal elemen lama, masing-masing.Jadi, setiap kali Anda menambahkan elemen ke
queue
Anda dapat mencadangkannya denganremove
pemanggilan metode.PEMBARUAN : -
Dan jika Anda ingin memperbaiki ukuran
Queue
, maka Anda dapat melihat: -ApacheCommons#CircularFifoBuffer
Dari
documentation
: -Seperti yang Anda lihat, ketika ukuran maksimum tercapai, kemudian menambahkan elemen baru secara otomatis menghapus elemen pertama yang dimasukkan.
sumber
Saya pikir implementasinya harus mudah, tetapi mempertimbangkan efisiensi, Anda harus menggunakan LinkedList tetapi tidak ArrayList sebagai wadah. Anda dapat merujuk pada kode berikut:
sumber
Java LinkedList menyediakan metode addFirst (E e) dan push (E e) yang menambahkan elemen ke bagian depan daftar.
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)
sumber
Anda dapat menggunakan kode ini
sumber
Anda dapat menggunakan metode daftar, menghapus dan menambahkan
sumber
Ambil contoh ini: -
sumber
Kamu bisa memakai
Ubah E dengan tipe data Anda
Jika menghapus elemen tertua diperlukan maka Anda dapat menambahkan:
sebelum pernyataan pengembalian. Kalau tidak, daftar akan menambahkan objek Anda di awal dan juga mempertahankan elemen tertua.
Ini akan menghapus elemen terakhir dalam daftar.
sumber
sumber
Saya memiliki masalah yang sama, mencoba untuk menambahkan elemen di awal array yang ada, menggeser elemen yang ada ke kanan dan membuang yang tertua (array [panjang-1]). Solusi saya mungkin tidak sangat performan tetapi berfungsi untuk tujuan saya.
Semoga berhasil
sumber