Dizi Listesinden Öğeyi Kaldır


100

Bir ArrayListvarsayımım var listve 8 öğe AH var ve şimdi int dizisinde depolanan 1,3,5 konum Öğeyi silmek istiyorumlist nasıl yapabilirimden .

Bunu yapmaya çalışıyorum

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]);
}

Ancak ilk öğe silindikten sonra dizinin konumu değiştirilir ve sonraki yinelemede yanlış öğeyi siler veya istisna verir.


Onu azalan indis sırasına göre kaldırmaya ne dersiniz (indisleri sıralayın, sonra en yüksek indeksi olan öğeyi önce kaldırın)?
nhahtdh

1
Mantığınız kusurlu. Elbette, her bir öğenin konumunu değil, öğelerin kendisini düşünmelisiniz. Başka bir deyişle, 1, 3 ve 5 numaralı konumları kaldırmak istemezsiniz, bunun yerine , ve Listkullanarak öğeleri (nerede olurlarsa olsunlar) kaldırmak istersiniz . Bunu düşün. equals("B")equals("D")equals("F")
Squonk

Evet Öğeyi silmek istiyorum ama Öğeleri nasıl eşleştirebilirim. Aslında gerçekte bu öğeler ListView'da ve
seçimde

Yavaş seçenek: Öğeleri ikinci bir listeye ekledikten sonra yineleyin, ilk listeyi kaldırarak ikinci listeyi yineleyin (isteğe bağlı adım: ikinci listeyi arayana geri gönderin)
SparK

Yanıtlar:


134

Bu özel durumda , öğeleri azalan sırada kaldırmanız gerekir. Önce indeks 5, sonra 3, sonra 1. Bu, istenmeyen yan etkiler olmadan öğeleri listeden kaldıracaktır.

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

1
OP'nin ArrayList'i Strings değil Integers içerir (yine de gözleminize katılıyorum).
Alex Lockwood

@Alex: Bu cevap işe yarayacak, ancak soruda OP'nin mantığı kadar kusurlu. Bahsettiğimiz şey ArrayList<E>- neden birisi bir nesneyi ArrayListo konumda ne olduğunu test etmek yerine tamamen konuma dayalı bir konumdan çıkarmak istesin ki? OP String, nesne türü olarak kullanılıyor olabilir , ArrayListancak cevabınız, OP'nin özel durumunu çözse bile jenerikler için gerçekten kötü bir kodlama uygulamasıdır.
Squonk

3
Evet ben size katılıyorum. Ama OP sordu ArrayList<String>, değil ArrayList<E>.
Adrian Monk

Bu yanıta kesinlikle katılmıyorum, @MisterSquonk ikna oldum, çözüm genel olmalı. Üstelik neden olumsuz oy alıyorum?
Mohammed Azharuddin Shaikh

66
Tamam, dinle ... Önemli olan ne bilmiyorum. OP kodunu gönderdi ve ben olası bir düzeltmeyi gösteren bir cevapla yanıt verdim. Tamamen genel bir çözüm sunarak yukarıda ve öteye geçmediğim için üzgünüm ... ama anlayabildiğim kadarıyla OP bir programlama dersi istemiyordu. "Bu kod neden çalışmıyor?" Diye soruyordu. Sırf soruyu farklı yorumladığınız için cevabınızı aşağı oyladığım için beni suçlamaya başlamayın.
Alex Lockwood

30

Öğeleri ArrayListkullanmaktan kaldırabilirsiniz 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

Java'da Collection'dan nesneleri kaldırmak için ListIterator remove () yöntemini kullanmak daha iyi ve iyi bir uygulamadır, çünkü başka bir iş parçacığının aynı koleksiyonu değiştirmesi ve ConcurrentModificationException'a yol açma ihtimali olabilir.
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

Önceden belirtildiği üzere

iterator.remove()

döngü sırasında liste öğelerini kaldırmanın belki de tek güvenli yoludur.

Yineleyici kullanarak öğe kaldırmanın daha derinlemesine anlaşılması için bu ileti dizisine bakmayı deneyin


Oyları şaşırtmıyorum, sana tamamen katılıyorum. Bu, bunu yapmanın en güvenli yoludur.
Simmant

3

İ dizisinin sıralandığını varsayıyorum, işte Yineleyici ile başka bir çözüm, daha genel:

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

Buna ne dersin? Bir düşünün-

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);

        }


}

Ve çıktı-

[A, C, E, G, H]

2

Bu şekilde dene

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

"=" Kullanırsanız, ikinci dizideki orijinal dizi listesi için bir çoğaltma oluşturulur, ancak başvuru aynıdır, bu nedenle bir listede değişiklik yaparsanız, diğeri de değiştirilir. Bunu "=" yerine kullanın

        List_Of_Array1.addAll(List_Of_Array);

2

arraylist'in remove (int indeks) yöntemi, listede belirtilen konumdaki (indeks) öğeyi kaldırır. Dizi listesi öğelerini kaldırdıktan sonra, sonraki öğeleri sola kaydırır.

Bir dizi listesinin {20,15,30,40} içerdiği anlamına gelir

Yöntemi çağırdım: arraylist.remove (1)

daha sonra veri 15 silinecek ve 30 & 40 bu iki öğe 1 sola kaydırılacaktır.

Bu nedenle önce dizi listesinin daha yüksek dizin öğesini silmeniz gerekir.

Öyleyse ... sizin durumunuz için .. kod ..

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]);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.