MINT lernen

Algorithmen mit DynArray

Summieren, suchen, löschen: Warum eine harmlose Schleife beim Löschen plötzlich Elemente überspringt.

1

Eine Reihung durchlaufen

Fast jeder Algorithmus auf einer dynamischen Reihung besucht die Elemente der Reihe nach — mit einer Zählschleife über alle gültigen Indizes.

  • Durchlauf:Laufvariable i von 0 bis getLength() - 1, Zugriff mit getItem(i).
  • Summe, Anzahl:Variable vor der Schleife anlegen, in jedem Durchlauf anpassen, danach zurückgeben.
  • Suchen:beim ersten Treffer sofort den Index zurückgeben — nach der Schleife −1 für „nicht enthalten“.
  • Maximum:mit getItem(0) starten, ab Index 1 vergleichen und bei Bedarf ersetzen.
int summe = 0;
for (int i = 0; i < punkte.getLength(); i++) {
    summe = summe + punkte.getItem(i);
}
public int indexVon(DynArray<String> liste, String gesucht) {
    for (int i = 0; i < liste.getLength(); i++) {
        if (liste.getItem(i).equals(gesucht)) {
            return i;        // gefunden: sofort zurück
        }
    }
    return -1;               // nicht enthalten
}
2

Elemente in der Schleife löschen

Gelöscht wird oft nicht ein einzelnes Element, sondern alle, die eine Bedingung erfüllen — etwa alle Bewertungen unter 5 Punkten. Genau hier steckt eine Falle.

  • Problem:nach delete(i) rückt das nächste Element auf Index i — das anschließende i++ springt darüber hinweg.
  • Lösung 1:rückwärts laufen — verschoben werden dann nur Elemente, die schon geprüft sind.
  • Lösung 2:while-Schleife, die i nur erhöht, wenn nichts gelöscht wurde.

Wähle eine Variante und lass die Schleife mit ▶ laufen oder gehe mit „Schritt“ einzeln vor. Die Tracetabelle wächst mit. Vergleiche das Ergebnis der drei Varianten.

Löschschleife im Zeitraffer


    

Halte fest: Die Vorwärts-Schleife überspringt nach jedem Löschen ein Element. Rückwärts laufen oder i nur ohne Löschen erhöhen liefert immer das richtige Ergebnis.

Merke

Löschen in einer Schleife: von hinten nach vorn laufen — for (int i = liste.getLength() - 1; i >= 0; i--)

3

Allgemeine Hinweise

< statt <=

Die Schleifenbedingung lautet i < liste.getLength(). Mit <= greift der letzte Durchlauf auf einen Index zu, den es nicht gibt.

Texte mit equals

Zeichenketten vergleicht man mit equals, nicht mit ==. Sonst wird geprüft, ob es dasselbe Objekt ist, nicht ob der Text gleich ist.

Tracetabelle führen

Eine Spalte für i, eine für die Reihung, eine für die Bedingung: So fallen übersprungene Elemente sofort auf — auch in der Klausur.

Videos