Hapus Item dari ArrayList


100

Saya ArrayListkira list, dan itu memiliki 8 item AH dan sekarang saya ingin menghapus 1,3,5 posisi Item yang disimpan dalam array int dari listbagaimana saya bisa melakukan ini.

Saya mencoba melakukan ini dengan

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = 0; j < i.length; j++) {
    list.remove(i[j]);
}

Tetapi setelah item pertama dihapus, posisi array diubah dan di iterasi berikutnya menghapus elemen yang salah atau memberikan pengecualian.


Bagaimana jika menghapusnya dalam urutan indeks yang menurun (urutkan indeks, lalu hapus elemen dengan indeks tertinggi terlebih dahulu)?
nhahtdh

1
Logika Anda salah. Tentunya Anda tidak harus memikirkan posisi masing-masing item tetapi malah memikirkan item itu sendiri. Dengan kata lain, Anda tidak ingin menghapus posisi 1, 3 & 5 tetapi Anda ingin menghapus item (di mana pun mereka berada List) menggunakan equals("B"), equals("D")dan equals("F"). Pikirkan tentang itu.
Squonk

Ya saya ingin menghapus Item tapi bagaimana saya bisa mencocokkan Item. Sebenarnya item ini sebenarnya ada di ListView dan di pilih Saya ingin menghapus ini dari DB dan Array dan menyegarkan adaptor dan Daftar
Krishnakant Dalal

Opsi lambat: ulangi setelah menambahkan elemen ke daftar kedua, ulangi daftar kedua dengan menghapus dari yang pertama (langkah opsional: kembalikan daftar kedua ke pemanggil)
SparK

Jawaban:


134

Dalam kasus khusus ini , Anda harus menghapus elemen dalam urutan menurun. Indeks pertama 5, kemudian 3, kemudian 1. Ini akan menghapus elemen dari daftar tanpa efek samping yang tidak diinginkan.

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}

1
ArrayList OP berisi Strings, bukan Integers (meskipun demikian, saya setuju dengan pengamatan Anda).
Alex Lockwood

@Alex: Jawaban ini akan berfungsi tetapi sama cacatnya dengan logika OP dalam pertanyaan mereka. Kita sedang berbicara tentang ArrayList<E>- mengapa ada orang yang ingin menghapus objek dari ArrayListmurni berdasarkan posisi alih-alih menguji apa yang ada di posisi itu? OP mungkin digunakan Stringsebagai tipe objek untuk ArrayListtapi jawaban Anda benar-benar praktik pengkodean yang buruk untuk obat generik bahkan jika itu menyelesaikan situasi khusus OP.
Squonk

3
Ya aku setuju denganmu. Tapi OP bertanya tentang ArrayList<String>, bukan ArrayList<E>.
Adrian Monk

Saya sama sekali tidak setuju dengan jawaban ini, @MisterSquonk ya yakin, solusinya harus generik. Apalagi kenapa saya mendapatkan downvote?
Mohammed Azharuddin Shaikh

66
Oke, dengar ... Saya tidak tahu apa masalahnya. OP memposting kodenya dan saya menjawab dengan jawaban yang menggambarkan kemungkinan perbaikan. Maaf saya tidak melangkah lebih jauh dengan memberikan solusi yang sepenuhnya umum ... tetapi sejauh yang saya tahu, OP tidak meminta pelajaran pemrograman. Dia bertanya "mengapa kode ini tidak berfungsi?" Jangan mulai menyalahkan saya karena menolak jawaban Anda hanya karena Anda menafsirkan pertanyaan secara berbeda.
Alex Lockwood

30

Anda dapat menghapus elemen dari ArrayListpenggunaan ListIterator,

ListIterator listIterator = List_Of_Array.listIterator();

 /* Use void remove() method of ListIterator to remove an element from List.
     It removes the last element returned by next or previous methods.
 */
listIterator.next();

//remove element returned by last next method
listIterator.remove();//remove element at 1st position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 3rd position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 5th position

Praktik yang lebih baik dan baik untuk menggunakan metode ListIterator remove () untuk menghapus objek dari Collection di Java, karena mungkin ada kemungkinan thread lain memodifikasi koleksi yang sama dan dapat mengarah ke ConcurrentModificationException.
Min2

10
 public void DeleteUserIMP(UserIMP useriamp) {
       synchronized (ListUserIMP) {
            if (ListUserIMP.isEmpty()) {
            System.out.println("user is empty");
        }  else {
            Iterator<UserIMP> it = ListUserIMP.iterator();
            while (it.hasNext()) {
                UserIMP user = it.next();
                if (useriamp.getMoblieNumber().equals(user.getMoblieNumber())) {
                    it.remove();
                    System.out.println("remove it");
                }
            }
            // ListUserIMP.remove(useriamp);

            System.out.println(" this user removed");
        }
        Constants.RESULT_FOR_REGISTRATION = Constants.MESSAGE_OK;
        // System.out.println("This user Deleted " + Constants.MESSAGE_OK);

    }
}

7

Seperti yang telah disebutkan sebelumnya

iterator.remove()

mungkin satu-satunya cara yang aman untuk menghapus item daftar selama pengulangan.

Untuk pemahaman yang lebih dalam tentang penghapusan item menggunakan iterator, coba lihat utas ini


Saya linglung tidak setuju, saya setuju dengan Anda. Ini adalah cara teraman untuk melakukannya.
Simmant

3

Saya berasumsi bahwa array i diurutkan naik, berikut adalah solusi lain dengan Iterator, ini lebih umum:

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

Iterator<String> itr = list.iterator();
int pos = 0;
int index = 0;
while( itr.hasNext() ){
    itr.next();
    if( pos >= i.length ){
        break;
    }
    if( i[pos] == index ){
        itr.remove();
        pos++;
    }

    index++;
}

2

Bagaimana dengan ini? Pikirkan saja-

import java.util.ArrayList;

class Solution
{
        public static void main (String[] args){

             ArrayList<String> List_Of_Array = new ArrayList<String>();
             List_Of_Array.add("A");
             List_Of_Array.add("B");
             List_Of_Array.add("C");
             List_Of_Array.add("D");
             List_Of_Array.add("E");
             List_Of_Array.add("F");
             List_Of_Array.add("G");
             List_Of_Array.add("H");

             int i[] = {1,3,5};

             for (int j = 0; j < i.length; j++) {
                 List_Of_Array.remove(i[j]-j);
             }

             System.out.println(List_Of_Array);

        }


}

Dan hasilnya adalah-

[A, C, E, G, H]

2

Coba cara ini,

ArrayList<String> List_Of_Array = new ArrayList<String>();
List_Of_Array.add("A");
List_Of_Array.add("B");
List_Of_Array.add("C");
List_Of_Array.add("D");
List_Of_Array.add("E");
List_Of_Array.add("F");
List_Of_Array.add("G");
List_Of_Array.add("H");

int i[] = {5,3,1};

for (int j = 0; j < i.length; j++) {
    List_Of_Array.remove(i[j]);
}

2
String[] mString = new String[] {"B", "D", "F"};

for (int j = 0; j < mString.length-1; j++) {
        List_Of_Array.remove(mString[j]);
}

2

Jika Anda menggunakan "=", replika akan dibuat untuk daftar larik asli di daftar kedua, tetapi referensinya sama jadi jika Anda mengubah satu daftar, daftar lainnya juga akan dimodifikasi. Gunakan ini sebagai ganti "="

        List_Of_Array1.addAll(List_Of_Array);

2

remove (int index) metode dari daftar larik menghapus elemen pada posisi yang ditentukan (indeks) dalam daftar. Setelah menghapus item daftar larik menggeser elemen berikutnya ke kiri.

Berarti jika daftar larik berisi {20,15,30,40}

Saya telah memanggil metode: arraylist.remove (1)

maka data 15 akan dihapus dan 30 & 40 kedua item ini akan dibiarkan bergeser 1.

Untuk alasan ini Anda harus menghapus item indeks yang lebih tinggi dari daftar larik terlebih dahulu.

Jadi..untuk situasi yang diberikan..kodenya akan ..

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.