Java ArrayDaftar cara menambahkan elemen di awal

183

Saya perlu menambahkan elemen ke ArrayListantrian 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?

ZeDonDino
sumber
Apakah maksud Anda suka removedan add?
Peter Lawrey
Apa yang Anda gunakan arraylist stack queue whateveruntuk menambah awal array sebaiknya dihindari dan sepertinya Anda harus menggunakan koleksi yang berbeda.
Peter Lawrey
Pertama, Anda harus membuat sesuatu sendiri. Apa yang telah kamu lakukan sejauh ini?
Yegoshin Maxim

Jawaban:

301

Listmemiliki metode add(int, E), sehingga Anda dapat menggunakan:

list.add(0, yourObject);

Setelah itu Anda dapat menghapus elemen terakhir dengan:

if(list.size() > 10)
    list.remove(list.size() - 1);

Namun, Anda mungkin ingin memikirkan kembali kebutuhan Anda atau menggunakan struktur data yang berbeda, seperti a Queue

EDIT

Mungkin lihat di Apache CircularFifoQueue:

CircularFifoQueue adalah antrian pertama-masuk pertama dengan ukuran tetap yang menggantikan elemen tertua jika penuh.

Inisialisasi dengan ukuran maksimum Anda:

CircularFifoQueue queue = new CircularFifoQueue(10);
Baz
sumber
10
Saya tidak akan menyentuh perpustakaan apache dengan tiang sepuluh kaki, terutama karena kelas koleksi jambu ada. Penggusuran Guava mungkin merupakan pilihan yang baik di sini.
DPM
26

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 waktuO(n)

Deque

JDK termasuk Dequestruktur yang menawarkan metode seperti addFirst(e)danofferFirst(e)

Deque<String> deque = new LinkedList<>();
deque.add("two");
deque.add("one");
deque.addFirst("three");
//prints "three", "two", "one"

Analisis

Kompleksitas ruang dan waktu penyisipan adalah dengan LinkedListkonstan ( O(1)). Lihat lembar contekan Big-O .

Membalikkan Daftar

Metode yang sangat mudah tetapi tidak efisien adalah dengan menggunakan terbalik:

 Collections.reverse(list);
 list.add(elementForTop);
 Collections.reverse(list);

Jika Anda menggunakan aliran Java 8, jawaban ini mungkin menarik bagi Anda.

Analisis

  • Kompleksitas Waktu: O(n)
  • Kompleksitas Ruang: O(1)

Melihat implementasi JDK ini memiliki O(n)kompleksitas waktu sehingga hanya cocok untuk daftar yang sangat kecil.

Patrick Favre
sumber
Membalik daftar dua kali. Apakah ini akan menambah run time dari algoritma dengan margin besar dibandingkan dengan solusi yang diterima di atas?
Samyak Upadhyay
Ia menambahkan 2n, jadi ya, tetapi jika Anda memiliki daftar <50 Anda tidak akan dapat membuat tolok ukur mikro pada kebanyakan mesin modern
Patrick Favre
8

Anda dapat melihat pada add (indeks int, elemen E) :

Menyisipkan elemen yang ditentukan pada posisi yang ditentukan dalam daftar ini. Menggeser elemen yang saat ini berada di posisi itu (jika ada) dan elemen berikutnya ke kanan (menambahkan satu ke indeks mereka).

Setelah Anda menambahkan, Anda dapat memeriksa ukuran ArrayList dan menghapus yang di akhir.

npinti
sumber
4

Anda mungkin ingin melihat Deque. itu memberi Anda akses langsung ke item pertama dan terakhir dalam daftar.

Evvo
sumber
1
Saya terkejut Anda adalah satu-satunya jawaban yang berbicara tentang Deque, ini jelas merupakan solusi optimal terbaik.
Guillaume F.
3

Apa yang Anda gambarkan, adalah situasi yang tepat untuk digunakan Queue.

Karena Anda ingin addelemen baru, dan removeyang lama. Anda dapat menambahkan di akhir, dan menghapus dari awal. Itu tidak akan membuat banyak perbedaan.

Antrian memiliki metode add(e)dan remove()yang menambahkan pada akhirnya elemen baru, dan menghapus dari awal elemen lama, masing-masing.

Queue<Integer> queue = new LinkedList<Integer>();
queue.add(5);
queue.add(6);
queue.remove();  // Remove 5

Jadi, setiap kali Anda menambahkan elemen ke queueAnda dapat mencadangkannya dengan removepemanggilan metode.


PEMBARUAN : -

Dan jika Anda ingin memperbaiki ukuranQueue , maka Anda dapat melihat: -ApacheCommons#CircularFifoBuffer

Dari documentation: -

CircularFifoBuffer adalah buffer keluar masuk pertama dengan ukuran tetap yang menggantikan elemen tertua jika penuh.

Buffer queue = new CircularFifoBuffer(2); // Max size

queue.add(5);
queue.add(6);
queue.add(7);  // Automatically removes the first element `5`

Seperti yang Anda lihat, ketika ukuran maksimum tercapai, kemudian menambahkan elemen baru secara otomatis menghapus elemen pertama yang dimasukkan.

Rohit Jain
sumber
1

Saya pikir implementasinya harus mudah, tetapi mempertimbangkan efisiensi, Anda harus menggunakan LinkedList tetapi tidak ArrayList sebagai wadah. Anda dapat merujuk pada kode berikut:

import java.util.LinkedList;
import java.util.List;

public class DataContainer {

    private List<Integer> list;

    int length = 10;
    public void addDataToArrayList(int data){
        list.add(0, data);
        if(list.size()>10){
            list.remove(length);
        }
    }

    public static void main(String[] args) {
        DataContainer comp = new DataContainer();
        comp.list = new LinkedList<Integer>();

        int cycleCount = 100000000;

        for(int i = 0; i < cycleCount; i ++){
            comp.addDataToArrayList(i);
        }
    }
}
feikiss
sumber
0

Anda dapat menggunakan kode ini

private List myList = new ArrayList();
private void addItemToList(Object obj){
    if(myList.size()<10){
      myList.add(0,obj);
    }else{
      myList.add(0,obj);
      myList.remove(10);
    }
}
MaVRoSCy
sumber
0

Anda dapat menggunakan metode daftar, menghapus dan menambahkan

list.add(lowestIndex, element);
list.remove(highestIndex, element);
Saya_
sumber
0

Ambil contoh ini: -

List<String> element1 = new ArrayList<>();
element1.add("two");
element1.add("three");
List<String> element2 = new ArrayList<>();
element2.add("one");
element2.addAll(element1);
Ashish Mehta
sumber
-1

Kamu bisa memakai

public List<E> addToListStart(List<E> list, E obj){
list.add(0,obj);
return (List<E>)list;

}

Ubah E dengan tipe data Anda

Jika menghapus elemen tertua diperlukan maka Anda dapat menambahkan:

list.remove(list.size()-1); 

sebelum pernyataan pengembalian. Kalau tidak, daftar akan menambahkan objek Anda di awal dan juga mempertahankan elemen tertua.

Ini akan menghapus elemen terakhir dalam daftar.

seorang Pembelajar
sumber
-1
import java.util.*:
public class Logic {
  List<String> list = new ArrayList<String>();
  public static void main(String...args) {
  Scanner input = new Scanner(System.in);
    Logic obj = new Logic();
      for (int i=0;i<=20;i++) {
        String string = input.nextLine();
        obj.myLogic(string);
        obj.printList();
      }
 }
 public void myLogic(String strObj) {
   if (this.list.size()>=10) {
      this.list.remove(this.list.size()-1);
   } else {
     list.add(strObj); 
   }
 }
 public void printList() {
 System.out.print(this.list);
 }
}
Machhindra Neupane
sumber
-2

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.

 Method:

   updateArray (Element to insert)

     - for all the elements of the Array
       - start from the end and replace with the one on the left; 
     - Array [0] <- Element

Semoga berhasil

FabianUx
sumber