Tambahkan objek ke ArrayList pada indeks yang ditentukan

142

Saya pikir itu pertanyaan yang cukup sederhana, tetapi saya tidak tahu bagaimana melakukan ini dengan benar.

Saya punya daftar array kosong:

ArrayList<object> list = new ArrayList<object>();

Saya punya beberapa objek yang ingin saya tambahkan dan setiap objek harus berada pada posisi tertentu. Namun perlu bahwa mereka dapat ditambahkan dalam setiap urutan yang mungkin. Ketika saya mencoba ini, itu tidak berhasil dan saya mendapatkan IndexOutOfBoundsException:

list.add(1, object1)
list.add(3, object3)
list.add(2, object2)

Apa yang saya coba adalah mengisi ArrayListdengan nulldan kemudian melakukan hal di atas. Itu bekerja, tapi saya pikir itu solusi yang mengerikan. Apakah ada cara lain untuk melakukan ini?

J. Maes
sumber
7
Anda mendapatkan IndexOutOfBoundsException karena daftar itu kosong dan Anda tidak dapat mengakses posisi daftar yang tidak ada ...
Vic
1
Apakah ada cara untuk membuat posisi itu tanpa mengisi daftar dengan objek nol? Bagi saya sepertinya ini solusi yang sangat aneh.
J. Maes
1
Saya rasa tidak ... Jika Anda perlu menambahkan objek dalam urutan acak, Anda harus mencari cara lain untuk melakukannya .. Misalnya dengan array khas: 'Objek []' dan kemudian Anda tidak boleh harus mengisinya, cukup inisialisasi
Vic
1
@ Maethortje itu bukan masalah aneh. Carilah daftar yang jarang, referensi.wolfram.com/mathematica/tutorial/… sepertinya artikel yang bagus. Namun di Jawa, Peta dengan indeks sebagai kunci mungkin merupakan pendekatan yang paling mudah.
Variabel sengsara
2
@Bahkan Meskipun Anda mendeklarasikan ukuran .. Itu hanya tidak menginisialisasi daftar, tetapi menyatakan berapa banyak ruang yang ingin Anda simpan dalam memori .. Seperti yang saya lihat, daftar adalah array elemen yang juga memiliki pointer ke elemen selanjutnya. Jika Anda mencoba menambahkan elemen ke posisi ketiga ketika Anda memiliki kosong kedua (atau nol) Anda tidak memiliki pointer untuk membantu Anda tahu itu adalah elemen ketiga ..: 1-> 2-> 3 OK, tetapi 1- > * -> 3 di sini Anda punya masalah ...
Vic

Jawaban:

209

Anda dapat melakukannya seperti ini:

list.add(1, object1)
list.add(2, object3)
list.add(2, object2)

Setelah Anda menambahkan object2 ke posisi 2, itu akan memindahkan object3 ke posisi 3.

Jika Anda ingin object3 berada di position3 sepanjang waktu, saya sarankan Anda menggunakan HashMap dengan posisi sebagai kunci dan objek sebagai nilai.

superM
sumber
3
Hashmap memang bisa menyelesaikan masalah ini. Saya pikir saya akan memilih yang itu karena sepertinya saya tidak bisa menambahkan sesuatu di lokasi 3 ketika tidak ada objek di lokasi 2.
J. Maes
pendek tapi kebanyakan. Lainnya berada di jalur yang salah
Shabbir Dhangot
Logika yang konstruktif!
Arsal Imam
31

Anda dapat menggunakan Array objek dan mengubahnya ke ArrayList-

Object[] array= new Object[10];
array[0]="1";
array[3]= "3";
array[2]="2";
array[7]="7";

List<Object> list= Arrays.asList(array);

ArrayList akan menjadi [1, null, 2, 3, null, null, null, 7, null, null]

pengguna3484940
sumber
2
Salah satu kekurangannya adalah Anda harus tahu ukuran terlebih dahulu.
Daniel Hári
17

Jika itu masalahnya maka mengapa Anda tidak mempertimbangkan menggunakan Array biasa, menginisialisasi kapasitas dan meletakkan objek pada indeks yang Anda inginkan.

Object[] list = new Object[10];

list[0] = object1;
list[2] = object3;
list[1] = object2;
medopal
sumber
Anda memulai kapasitas, tetapi bukan ukuran 'ArrayList'. Ukurannya didefinisikan sebagai jumlah elemen, dan ketika indeksnya> ukuran, pengecualiannya datang ...
Vic
@Vic, saya salah membaca pertanyaan pada awalnya, tapi terima kasih atas tipnya.
medopal
Saya menginisialisasi kapasitas pada 10, tapi saya masih mendapatkan IndexOutOfBoundsExceptopn saat menambahkan objek. Sama dengan mengubah kapasitas dengan sureCapacity. Satu-satunya yang berfungsi adalah mengisi dengan null saat ini ...
J. Maes
@Maethortje Cari perbedaan antara "ukuran" dan "kapasitas" ... Pengecualian muncul ketika indeks> ukuran, bukan ketika> kapasitas .....
Vic
Seperti yang disebutkan orang-orang, Anda menambahkan objek pada indeks 3, sedangkan ukuran daftar masih 1. Itu tidak mungkin. Menambahkan pada indeks tertentu diizinkan selama indeks ini berada di dalam batas-batas daftar, misalnya jika daftar Anda memiliki 3 objek, Anda tidak dapat menambahkan objek pada indeks 100.
medopal
14

Anda juga bisa mengesampingkan ArrayList untuk menyisipkan nol di antara ukuran Anda dan elemen yang ingin Anda tambahkan.

import java.util.ArrayList;


public class ArrayListAnySize<E> extends ArrayList<E>{
    @Override
    public void add(int index, E element){
        if(index >= 0 && index <= size()){
            super.add(index, element);
            return;
        }
        int insertNulls = index - size();
        for(int i = 0; i < insertNulls; i++){
            super.add(null);
        }
        super.add(element);
    }
}

Kemudian Anda dapat menambahkan kapan saja di ArrayList. Sebagai contoh, metode utama ini:

public static void main(String[] args){
    ArrayListAnySize<String> a = new ArrayListAnySize<>();
    a.add("zero");
    a.add("one");
    a.add("two");
    a.add(5,"five");
    for(int i = 0; i < a.size(); i++){
        System.out.println(i+": "+a.get(i));
    }
}   

menghasilkan hasil ini dari konsol:

0: nol

1 satu

2: dua

3: nol

4: nol

5: lima

EngineerWithJava54321
sumber
9

Saya menarik perhatian Anda ke ArrayList.adddokumentasi , yang mengatakan itu melempar IndexOutOfBoundsException- jika indeks berada di luar jangkauan (index < 0 || index > size() )

Periksa size()daftar Anda sebelum Anda meneleponlist.add(1, object1)

Variabel yang menyedihkan
sumber
Anda benar @Hemal, @Maethortje Mengapa Anda tidak memeriksa ukuran daftar sebelum Anda menambahkan elemen ke daftar? periksa apakah posisi yang ingin Anda tambahkan kurang dari ukuran daftar, jika tidak maka Anda bisa melakukan hal yang normallist.add("element");
Rakesh
1
Seperti yang saya pahami, "masalahnya" adalah menambahkan elemen pada posisi 3 bahkan jika tidak ada elemen di posisi 2 ...
Vic
@Vis yang daftar jarang - lihat komentar saya untuk pertanyaan.
Variabel sengsara
5

Anda perlu mengisi indeks kosong dengan nol.

while (arraylist.size() < position)
{
     arraylist.add(null);
}

arraylist.add(position, object);
Miika Pakarinen
sumber
2
@Maethortje 

The problem here is java creates an empty list when you called new ArrayList and 

ketika mencoba menambahkan elemen pada posisi yang ditentukan Anda mendapat IndexOutOfBound, sehingga daftar harus memiliki beberapa elemen di posisi mereka.

Silakan coba ikuti

/*
  Add an element to specified index of Java ArrayList Example
  This Java Example shows how to add an element at specified index of java
  ArrayList object using add method.
*/

import java.util.ArrayList;

public class AddElementToSpecifiedIndexArrayListExample {

  public static void main(String[] args) {
    //create an ArrayList object
    ArrayList arrayList = new ArrayList();

    //Add elements to Arraylist
    arrayList.add("1");
    arrayList.add("2");
    arrayList.add("3");

    /*
      To add an element at the specified index of ArrayList use
      void add(int index, Object obj) method.
      This method inserts the specified element at the specified index in the
      ArrayList.  
    */
    arrayList.add(1,"INSERTED ELEMENT");

    /*
      Please note that add method DOES NOT overwrites the element previously
      at the specified index in the list. It shifts the elements to right side
      and increasing the list size by 1.
    */

    System.out.println("ArrayList contains...");
    //display elements of ArrayList
    for(int index=0; index < arrayList.size(); index++)
      System.out.println(arrayList.get(index));

  }
}

/*
Output would be
ArrayList contains...
1
INSERTED ELEMENT
2
3

*/
Sankalp
sumber
Saya mengerti masalah yang menyebabkan kesalahan saya. Sepertinya saya harus menambahkan objek ke posisi berikutnya sebelum saya dapat menambahkan objek ke posisi itu. Saat saya menambahkan, saya tidak membuang semua objek yang ingin saya tambahkan. Apakah Anda pikir menambahkan objek nol adalah solusi yang tepat?
J. Maes
@Maethortje Tidak akan adil untuk melakukan ini, karena ini hanya hack :)
Sankalp
Anda perlu menghapus kode contoh harga dari paragraf pertama.
Jalal Sordo
2

Bagaimana dengan whilelingkaran kecil ini sebagai solusi?

private ArrayList<Object> list = new ArrayList<Object>();

private void addObject(int i, Object object) {
    while(list.size() < i) {
        list.add(list.size(), null);
    }
    list.add(i, object);
}
....

addObject(1, object1)
addObject(3, object3)
addObject(2, object2)
Stewart
sumber
2

Ini adalah solusi yang mungkin:

list.add(list.size(), new Object());
Darius
sumber
1

Saya pikir solusi dari medopal adalah apa yang Anda cari.

Tetapi hanya solusi alternatif lain adalah dengan menggunakan HashMap dan menggunakan kunci (Integer) untuk menyimpan posisi.

Dengan cara ini Anda tidak perlu mengisinya dengan nulls dll awalnya, cukup tempel posisi dan objek di peta saat Anda melanjutkan. Anda dapat menulis beberapa baris di akhir untuk mengubahnya menjadi Daftar jika Anda membutuhkannya.

Ashkan Aryan
sumber
Bukankah TreeMap lebih baik sejak dipesan oleh kunci?
Daniel Hári
1

Misalkan Anda ingin menambahkan item pada suatu posisi, maka ukuran daftar harus lebih dari posisi itu.

add(2, item): sintaks ini berarti, pindahkan item lama di posisi 2 ke indeks berikutnya dan tambahkan item di posisi 2.

Jika tidak ada item di posisi 2, maka ini tidak akan berfungsi, Ini akan melempar pengecualian.

Itu berarti jika Anda ingin menambahkan sesuatuposition 2,

ukuran daftar Anda harus setidaknya (2 + 1) =3,sehingga barang tersedia di0,1,2 Position.

dengan cara itu dipastikan bahwa posisi 2 diakses dengan aman dan tidak akan ada pengecualian.

Shamsul Arefin Sajib
sumber
2
Saya hanya lewat ketika saya memberi tahu jawaban Anda ... sebenarnya, indeks harus lebih rendah atau sama dengan panjang sebenarnya dari daftar saat ini kami sedang memasukkan item baru. exhample: ukuran daftar adalah 2: menambahkan dalam indeks 2 akan berfungsi. menambahkan indeks 3 akan memunculkan eksepsi. (Diuji)
Houssem Chlegou
0

Jika Anda menggunakan Android Java, mungkin saya sarankan menggunakan SparseArray . Ini adalah pemetaan bilangan bulat ke objek yang lebih efisien dan lebih mudah untuk diulang daripada Peta

AllDayAmazing
sumber
0

Agak telat tapi semoga tetap bisa bermanfaat bagi seseorang.

2 langkah untuk menambahkan item ke posisi tertentu di sebuah ArrayList

  1. add null item ke indeks spesifik dalam ArrayList
  2. Maka setposisi seperti dan ketika diperlukan.

        list = new ArrayList();//Initialise the ArrayList
    for (Integer i = 0; i < mItems.size(); i++) {
        list.add(i, null); //"Add" all positions to null
    }
       // "Set" Items
        list.set(position, SomeObject);

Dengan cara ini Anda tidak memiliki item berlebihan di ArrayListyaitu jika Anda menambahkan item seperti,

list = new ArrayList(mItems.size());    
list.add(position, SomeObject);

Ini tidak akan menimpa item yang ada di posisi semata, menggeser yang sudah ada ke kanan oleh satu - sehingga Anda memiliki ArrayList dengan indeks dua kali lebih banyak.

Zain
sumber
0

Anda harus mengatur daripada menambahkan untuk mengganti nilai yang ada di indeks.

list.add(1, object1)
list.add(2, object3)
list.set(2, object2)

Daftar akan berisi [object1, object2]

Saurabh
sumber