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.

Krishnakant Dalal
źródło
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]);
}
Alex Lockwood
źródło
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
Jainendra
źródło
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);

    }
}

źródło
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

shimon001
źródło
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++;
}
DàChún
źródło
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]
sgowd
źródło
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]);
}
Chan
źródło
2
String[] mString = new String[] {"B", "D", "F"};

for (int j = 0; j < mString.length-1; j++) {
        List_Of_Array.remove(mString[j]);
}
Mohammed Azharuddin Shaikh
źródło
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);
Rahul Gupta
źródło
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]);
}
Avijit Karmakar
źródło