Array removeAtIndex in Schleife trifft 'Array index out of range'

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Array removeAtIndex in Schleife trifft 'Array index out of range'

    Ich möchte eigentlich etwas ganz Einfaches machen; Ich habe ein Array, aus dem ich Werte, die eine bestimmte Zeichenanzahl unterschreiten, löschen möchte.

    Quellcode

    1. var scope = ressArray.count - 1
    2. for i in 0..<scope {
    3. let minimum = 50
    4. if countElements(ressArray[i]) > minimum {
    5. println("ressArray @ \(i)\t\(ressArray[i])")
    6. } else {
    7. ressArray.removeAtIndex(i)
    8. scope = ressArray.count - 1
    9. }
    Alles anzeigen


    ... am Ende des Durchlaufes erhalte ich die Fehlermeldung "fatal error: array index out of range". eigentlich setze ich aber scope zurück, weshalb mir nicht ganz klar ist, weshalb das ganze in einem fehler endet?
  • Ich hab ja keine Ahnung von Swift, aber ist nicht gedacht, dass man damit endlich ein wenig moderner Programmieren kann?

    Laut Handbuch macht man sowas

    Quellcode

    1. var newArray = ressArray.filter { countElements($0) > minimum }


    Keine Ahnung, ob das in-place geht. In-place is mir eh nich funktional genug :P
    C++
  • Die Zeile

    Quellcode

    1. for i in 0..<scope
    erstellt für

    Quellcode

    1. 0..<scope
    ein neues Range-Objekt, also hat die Zeile

    Quellcode

    1. scope = ressArray.count - 1
    keinen Einfluss auf die Laufweite der Range. Da du Objekte aus dem Array entfernst läufst du auf dem Index raus.

    Entweder du löst es wie zerm vorschlägt, oder du nutzt ne while-Schleife.
  • ... um nach den richtigen Vorschlägen, wie man das Problem von Anfang an umgehen kann* auch noch die Frage zu beantworten:

    Quellcode

    1. var scope = 5
    2. var range = 0..<scope
    3. for i in range {
    4. scope = 1
    5. println(i)
    6. }

    Mit dem "..<" Operator erzeugst du ein neues Objekt, und das ist unabhängig von den Eingabewerten; die Schleife läuft also so lange, wie ursprünglich festgelegt (wenn man nicht einen Abbruch erzwingt).

    * Nachtrag: und einer schnelleren Antwort mit ähnlichen Inhalt ;)