Frage

Auf diese Frage gibt es hier bereits eine Antwort:

Ok, ich versuche also, eine ArrayList zu durchlaufen und ein bestimmtes Element zu entfernen.Ich habe jedoch einige Probleme bei der Verwendung der For-Each-ähnlichen Struktur.Wenn ich den folgenden Code ausführe:

ArrayList<String> arr = new ArrayList<String>();
//... fill with some values (doesn't really matter)

for(String t : arr)
{
  t = " some other value "; //hoping this would change the actual array
}

for(String t : arr)
{
  System.out.println(t); //however, I still get the same array here
}

Meine Frage: Wie kann ich „t“ zu einem Zeiger auf „arr“ machen, damit ich die Werte in einer for-each-Schleife ändern kann?Ich weiß, dass ich die ArrayList mit einer anderen Struktur durchlaufen könnte, aber diese sieht so sauber und lesbar aus, dass es einfach schön wäre, „t“ zu einem Zeiger machen zu können.

Alle Kommentare sind willkommen!Selbst wenn Sie sagen, ich sollte es einfach aufgeben und ein anderes Konstrukt verwenden.

War es hilfreich?

Lösung

Ich denke, der beste Ansatz für eine Schleife verwenden kann.

    ArrayList<String> arr = new ArrayList<String>();

    for (int i = 0; i < arr.size(); i++) {

        String t = arr.get(i);

        if (// your condition is met) {
            arr.set(i, "your new value");
        }
    }

Andere Tipps

Das Problem ist, dass Sie versuchen, den Loop-scoped Verweis ändern t es auf eine neue String-Instanz verweisen zu lassen. Das wird nicht funktionieren. Es entspricht nicht den tatsächlichen Eintrag in der Arraylist verweisen. Sie müssen den tatsächlichen Wert der Referenz ändern. Wenn String wandelbar war und unter der Voraussetzung, dass für eine fiktive set() Methode, könnte man theoretisch tun

for (String t : arr) {
    t.set("some other value");
}

oder so, aber das ist nicht möglich, da es unveränderlich ist. Besser erhält einen Griff des Einstiegspunktes in der Anordnung selbst die normale for Schleife:

for (int i = 0; i < arr.size(); i++) {
    arr.set(i, "some other value");
}

Wenn Sie bei der Verwendung der erweiterten for Schleife bestehen, dann müssen Sie String durch StringBuilder ersetzen, die wandelbar ist:

for (StringBuilder t : arr) {
     t.delete(0, t.length()).append("some other value");
}

Denken Sie daran, Java ist Pass-by-Wert, nicht pass-by-reference.

-each nicht gibt Ihnen einen Index-Zeiger, so dass Sie kann es einfach nicht einen unveränderlichen Wert ändern verwenden.

So oder verwendet eine for-Schleife mit einem Index oder einen veränderlichen Typen verwenden (wie Stringbuffer, nicht String)

Ein Array von Objekten (wie Strings) ist in Java ein zusammenhängender Block, der eine geordnete Reihe von Referenzen enthält.Wenn Sie also ein Array mit 4 Strings haben, sind es in Wirklichkeit 4 im Array gespeicherte Referenzen und 4 String-Objekte, die sich außerhalb des Arrays befinden, aber von seinen 4 Elementen referenziert werden.

Das for-each-Konstrukt in Java erstellt eine lokale Variable und kopiert für jede Iteration die Referenz aus der Array-Zelle, die dieser Iteration entspricht, in diese lokale Variable.Wenn Sie die Schleifenvariable (t = " some other value") Sie verweisen auf eine neue Zeichenfolge, "some other value", in die lokale Variable t, nicht in das Array.

Dies steht im Gegensatz zu einigen anderen Sprachen (wie Perl), bei denen die Schleifenvariable wie ein Alias ​​für das Array-/Listenelement selbst fungiert.

Ihr Code neu geschrieben vom Compiler als so etwas wie folgt aus:

ArrayList<String> arr = new ArrayList<String>();
//... fill with some values (doesn't really matter)

for (final Iterator <String> i = arr.iterator(); i.hasNext();) {
    String t;

    t = i.next();
    t = " some other value "; // just changes where t is pointing
}

Zu tun, was Sie wollen, Sie würden die for-Schleife wie folgt schreiben:

for (final ListIterator<String> i = arr.iterator(); i.hasNext();) {
     final String t;

     t = i.next();
     i.set("some other value");
}

Iterator nicht die Set-Methode hat, nur ListIterator der Fall ist.

Im Grunde wollen Sie den String t aus der Liste arr entfernen. Sie einfach eine arr.remove (t) und Sie getan werden könnte. Aber Sie können es nicht tun, während sie über die gleiche Liste iterieren. Sie erhalten eine Ausnahme, wenn Sie versuchen, auf diese Weise die Liste zu ändern.

Sie haben zwei Möglichkeiten:

  1. klonen Sie Ihre Liste, durchlaufen den Klon und entfernen Sie die ‚spezifischen‘ String aus der ursprünglichen Liste
  2. eine Liste zum Löschen Kandidaten erstellen, fügen Sie alle ‚spezifischen‘ Strings zu dieser Liste und nach durch die ursprüngliche Liste iterieren, durchlaufen die wastebin und entfernen Sie alles, was Sie hier von der ursprünglichen Liste gesammelt haben.

Option 1 der easist ist, kann der Klon wie gemacht werden:

List<String> clone = new ArrayList<String>(arr);

Sie scheinen falsch zu verstehen, wie Objekte / Referenzen in Java arbeiten, die effektiv mit der Sprache ziemlich grundlegender Bedeutung ist. Dieser Code sollte jedoch tun, was Sie (Entschuldigung für die fehlende Erklärung) wollen:

ArrayList<String> arr = new ArrayList<String>();
//... fill with some values (doesn't really matter)

for(int i = 0; i < arr.size(); i++)
{
  arr.set(i, " some other value "); // change the contents of the array
}

for(String t : arr)
{
  System.out.println(t); 
}

Ich glaube, das ist nicht zu unveränderlich oder veränderlichen Zusammenhang steht.

 t = " some other value "; //hoping this would change the actual array

t nicht hält den Verweis auf aktuelles Objekt. Java kopiert den Wert von Arraylist und setzt diesen Wert in t so Wert Array-Liste nicht wirkt sich gehen.

HTH

Das ist gut beantwortet. Noch hier ist mein Vorschlag. Die t var Looping ist nur dort sichtbar. Es wird nicht außerhalb der Schleife zu sehen. Sie könnten t.set() tun, wenn es nicht String ist.

eine StringBuffer eher als einfache Zeichenfolgen verwenden. Auf diese Weise die Zeichenfolge innerhalb Wandelbare.

Strings sind unveränderlich. Wenn Sie einen wandelbaren Typ wie String / Buffer hatte, konnte man die Zeichenfolge in Ihrer Iteration ändern. Sie tun Referenzen haben, erinnern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top