Element aus ArrayList entfernen


100

Ich habe eine ArrayListAnnahme list, und es hat 8 Elemente AH und jetzt möchte ich 1,3,5 Position Element im int Array gespeichert aus dem listWie kann ich das tun.

Ich versuche das mit zu machen

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

Nachdem das erste gelöschte Element an der Position des Arrays geändert wurde, wird bei der nächsten Iteration das falsche Element gelöscht oder eine Ausnahme gemacht.


Wie wäre es, wenn Sie es in absteigender Reihenfolge der Indizes entfernen (sortieren Sie die Indizes und entfernen Sie zuerst das Element mit dem höchsten Index)?
nhahtdh

1
Ihre Logik ist fehlerhaft. Sicherlich sollten Sie nicht über die Position jedes Artikels nachdenken, sondern über die Artikel selbst. Mit anderen Worten, die Sie nicht wollen Positionen entfernen , um 1, 3 und 5 , sondern möchten Sie die Einzelteile entfernen (wo auch immer sie in der sind List) unter Verwendung von equals("B"), equals("D")und equals("F"). Denk darüber nach.
Squonk

Ja, ich möchte den Artikel löschen, aber wie kann ich Artikel abgleichen? Tatsächlich befinden sich diese Elemente in ListView und bei Auswahl möchte ich sie aus DB und Array löschen und Adapter und List
Krishnakant Dalal

Langsame Option: Iterieren Sie einmal, indem Sie die Elemente zu einer zweiten Liste hinzufügen, und wiederholen Sie die zweite Liste, indem Sie sie aus der ersten entfernen (optionaler Schritt:
Geben Sie

Antworten:


133

In diesem speziellen Fall sollten Sie die Elemente in absteigender Reihenfolge entfernen. Erster Index 5, dann 3, dann 1. Dadurch werden die Elemente ohne unerwünschte Nebenwirkungen aus der Liste entfernt.

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

1
Die ArrayList des OP enthält Strings, nicht Integers (trotzdem stimme ich Ihrer Beobachtung zu).
Alex Lockwood

@Alex: Diese Antwort wird funktionieren, ist aber genauso fehlerhaft wie die Logik des OP in ihrer Frage. Wir sprechen über ArrayList<E>- warum sollte jemand ein Objekt von einer ArrayListrein auf Position basierenden Position entfernen wollen, anstatt zu testen, was sich an dieser Position befindet? Das OP kann durchaus Stringals Objekttyp für das verwendet werden, ArrayListaber Ihre Antwort ist eine wirklich schlechte Codierungspraxis für Generika, selbst wenn es die spezielle Situation des OP löst.
Squonk

3
Ja, ich stimme dir zu. Aber das OP fragte ArrayList<String>nicht danach ArrayList<E>.
Adrian Monk

Ich bin mit dieser Antwort überhaupt nicht einverstanden, @MisterSquonk ya überzeugt, Lösung muss generisch sein. Außerdem, warum bekomme ich Downvote?
Mohammed Azharuddin Shaikh

66
OK, hör zu ... Ich weiß nicht, was die große Sache ist. Das OP veröffentlichte seinen Code und ich antwortete mit einer Antwort, die eine mögliche Lösung illustrierte. Es tut mir leid, dass ich nicht über eine ganz allgemeine Lösung hinausgegangen bin ... aber soweit ich das beurteilen kann, hat das OP nicht um eine Programmierstunde gebeten. Er fragte: "Warum funktioniert dieser Code nicht?" Machen Sie mich nicht dafür verantwortlich, dass ich Ihre Antwort abgelehnt habe, nur weil Sie die Frage anders interpretiert haben.
Alex Lockwood

30

Sie können Elemente aus der ArrayListVerwendung entfernen 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

Es ist besser und empfehlenswert, die ListIterator remove () -Methode zum Entfernen von Objekten aus der Sammlung in Java zu verwenden, da möglicherweise ein anderer Thread dieselbe Sammlung ändert und zu ConcurrentModificationException führen kann.
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

Wie bereits erwähnt

iterator.remove()

Dies ist möglicherweise der einzig sichere Weg, um Listenelemente während der Schleife zu entfernen.

Versuchen Sie, sich diesen Thread anzusehen, um ein besseres Verständnis für das Entfernen von Elementen mithilfe des Iterators zu erhalten


Ich bin benommen, keine Stimmen, ich stimme dir vollkommen zu. Dies ist der sicherste Weg, dies zu tun.
Simmant

3

Ich gehe davon aus, dass das Array i aufsteigend sortiert ist. Hier ist eine andere Lösung mit Iterator. Es ist allgemeiner:

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

Wie wäre es damit? Denken Sie einfach darüber nach.

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

        }


}

Und die Ausgabe war-

[A, C, E, G, H]

2

Versuchen Sie es so,

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

Wenn Sie "=" verwenden, wird in der zweiten ein Replikat für die ursprüngliche Arrayliste erstellt. Die Referenz ist jedoch dieselbe. Wenn Sie also in einer Liste ändern, wird auch die andere geändert. Verwenden Sie dies anstelle von "="

        List_Of_Array1.addAll(List_Of_Array);

2

remove (int index) Methode der Arrayliste entfernt das Element an der angegebenen Position (Index) in der Liste. Nach dem Entfernen von Arraylist-Elementen werden alle nachfolgenden Elemente nach links verschoben.

Bedeutet, wenn eine Arrayliste {20,15,30,40} enthält

Ich habe die Methode aufgerufen: arraylist.remove (1)

dann werden die Daten 15 gelöscht und 30 & 40 diese beiden Elemente werden um 1 verschoben.

Aus diesem Grund müssen Sie zuerst das Element mit dem höheren Index der Arrayliste löschen.

Also ... für Ihre gegebene Situation ... lautet der Code ...

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]);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.