Usuń element z ArrayList


100

Mam ArrayListprzypuszczać list, i posiada 8 pozycji AH i teraz chcę usunąć 1,3,5 położenie elementu zapisanego w tablicy int od listjak mogę to zrobić.

Próbuję to zrobić

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

Ale po usunięciu pierwszej pozycji pozycja tablicy jest zmieniana, aw następnej iteracji usuwa zły element lub daje wyjątek.


Co powiesz na usunięcie go w kolejności malejącej indeksów (posortuj indeksy, a następnie usuń najpierw element o najwyższym indeksie)?
nhahtdh

1
Twoja logika jest błędna. Z pewnością nie powinieneś myśleć o pozycji każdego przedmiotu, ale zamiast tego myśleć o samych przedmiotach. Innymi słowy, nie chcesz, aby usunąć pozycje 1, 3 i 5, ale zamiast tego chcesz usunąć elementy (tam, gdzie są one w List) za pomocą equals("B"), equals("D")i equals("F"). Pomyśl o tym.
Squonk

Tak, chcę usunąć przedmiot, ale jak mogę dopasować przedmioty. Właściwie w rzeczywistości te elementy są w ListView i po wybraniu Chcę usunąć to z DB i Array oraz odświeżyć adapter i List
Krishnakant Dalal

Wolna opcja: iteruj po dodaniu elementów do drugiej listy, iteruj drugą listę usuwając z pierwszej (opcjonalny krok: zwrócenie drugiej listy dzwoniącemu)
SparK

Odpowiedzi:


134

W tym konkretnym przypadku należy usunąć elementy w kolejności malejącej. Pierwszy wskaźnik 5, potem 3, potem 1. Spowoduje to usunięcie elementów z listy bez niepożądanych skutków ubocznych.

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

1
ArrayList OP zawiera Strings, not Integers (niemniej zgadzam się z twoją obserwacją).
Alex Lockwood

@Alex: Ta odpowiedź zadziała, ale jest tak samo błędna, jak logika OP w ich pytaniu. Mówimy o ArrayList<E>- dlaczego ktoś miałby chcieć usunąć obiekt z pozycji ArrayListopartej wyłącznie na pozycji, zamiast testować, co jest w tej pozycji? OP może być używany Stringjako typ obiektu dla, ArrayListale twoja odpowiedź jest naprawdę zła praktyka kodowania dla typów generycznych, nawet jeśli rozwiązuje konkretną sytuację OP.
Squonk

3
Tak, zgadzam się z tobą. Ale OP zapytał ArrayList<String>, nie ArrayList<E>.
Adrian Monk

Zupełnie nie zgadzam się z tą odpowiedzią, @MisterSquonk jesteś przekonany, że rozwiązanie musi być ogólne. Co więcej, dlaczego otrzymuję głos przeciw?
Mohammed Azharuddin Shaikh

66
OK, posłuchaj ... Nie wiem, o co chodzi. OP opublikował swój kod, a ja odpowiedziałem, ilustrując możliwą poprawkę. Przepraszam, że nie wyszedłem poza to, podając całkowicie ogólne rozwiązanie ... ale o ile wiem, OP nie prosił o lekcję programowania. Pytał „dlaczego ten kod nie działa?” Nie zaczynaj mnie obwiniać za odrzucenie Twojej odpowiedzi tylko dlatego, że inaczej zinterpretowałeś pytanie.
Alex Lockwood

30

Możesz usunąć elementy z ArrayListużywania 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

Lepszą i dobrą praktyką jest użycie metody remove () ListIterator do usuwania obiektów z Collection w Javie, ponieważ może być szansa, że ​​inny wątek modyfikuje tę samą kolekcję i może prowadzić do 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

Jak wspomniano wcześniej

iterator.remove()

jest prawdopodobnie jedynym bezpiecznym sposobem usuwania elementów listy podczas pętli.

Aby lepiej zrozumieć usuwanie elementów za pomocą iteratora, spróbuj przyjrzeć się temu wątkowi


Jestem oszołomiony, nie ma głosów, całkowicie się z tobą zgadzam. To najbezpieczniejszy sposób.
Simmant

3

Zakładam, że tablica i jest posortowana w górę, oto inne rozwiązanie z Iteratorem, jest bardziej ogólne:

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

Co powiesz na to? Po prostu pomyśl o tym

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

        }


}

A wynik był-

[A, C, E, G, H]

2

Spróbuj w ten sposób

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

Jeśli użyjesz "=", zostanie utworzona replika dla oryginalnej listy arraylisty w drugiej, ale odniesienie jest takie samo, więc jeśli zmienisz na jednej liście, druga również zostanie zmodyfikowana. Użyj tego zamiast „=”

        List_Of_Array1.addAll(List_Of_Array);

2

remove (int index) metoda arraylist usuwa element na określonej pozycji (indeks) na liście. Po usunięciu elementów arraylist przesuwa kolejne elementy w lewo.

Oznacza, jeśli arraylista zawiera {20,15,30,40}

Nazwałem metodę: arraylist.remove (1)

wtedy dane 15 zostaną usunięte, a 30 i 40 te dwa elementy zostaną przesunięte o 1.

Z tego powodu musisz najpierw usunąć element arraylist o wyższym indeksie.

A więc… dla danej sytuacji… kod będzie…

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]);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.