Gibt es eine einfache Möglichkeit, ein NSArray rückwärts zu durchlaufen?

70

Ich habe eine NSArrayund muss sie in einem speziellen Fall rückwärts durchlaufen, damit ich zuerst das letzte Element betrachte. Es ist aus Leistungsgründen: Wenn der letzte einfach keinen Sinn ergibt, können alle vorherigen ignoriert werden. Also möchte ich die Schleife brechen. Aber das wird nicht funktionieren, wenn ich von 0 nach n vorwärts iteriere. Ich muss von n auf 0 gehen. Vielleicht gibt es eine Methode oder Funktion, die ich nicht kenne, also müsste ich das Rad hier nicht neu erfinden.

Vielen Dank
quelle
4
"Wie kann ich ein NSArray in Objective-C umkehren?" ist eine ganz andere Frage.
Nestor

Antworten:

194

Um die anderen Antworten hinzuzufügen, können Sie sie -[NSArray reverseObjectEnumerator]in Kombination mit der Funktion zur schnellen Aufzählung in Objective-C 2.0 (verfügbar in Leopard, iPhone) verwenden:

for (id someObject in [myArray reverseObjectEnumerator])
{
    // print some info
    NSLog([someObject description]);
}

Quelle mit weiteren Informationen: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html

Sijmen Mulder
quelle
Wird dies als schnelle Aufzählung betrachtet und ist dies schneller als eine reguläre c for-Schleife, von der aus begonnen wird [myArray count]-1? Wie iteriert man NSStringrückwärts?
ma11hew28
Ich habe hier momentan keine Links, aber irgendwo gibt es ein Video (könnte ein WWDC gewesen sein), in dem ein Apple-Ingenieur erklärt, wie schnell die Aufzählung funktioniert und warum sie schnell ist. Es übertrifft sowohl die indexbasierte NSArray-Enumeration als auch die klassischen Foundation-Enumeratoren und je nach Szenario um ein Vielfaches.
Sijmen Mulder
Ich muss eine Reverse-for-Schleife für ein Wörterbuch ausführen. Wie geht das?
Ashwin G
4
@AshwinG Deine Frage macht keinen Sinn, da NSDictionarysie keine 'Bestellung' haben. Sie können sie in beliebiger Reihenfolge auflisten, es sei denn, Sie bestellen zuerst die Schlüssel / Werte.
Mattsven
17

Da dies für die Aufführung gedacht ist, haben Sie eine Reihe von Optionen und sollten sie alle ausprobieren, um herauszufinden, welche am besten funktioniert.

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Erstellen Sie eine umgekehrte Kopie des Arrays und durchlaufen Sie diese dann normal
  • Verwenden Sie eine Standard-C-for-Schleife und starten und arbeiten Sie rückwärts durch das Array.

Extremere Methoden (wenn die Leistung überkritisch ist)

  • Lesen Sie, wie Cocoa die schnelle Objektaufzählung implementiert, und erstellen Sie umgekehrt Ihr eigenes Äquivalent.
  • Verwenden Sie ein C- oder C ++ - Array.

Es kann andere geben. In diesem Fall kann jeder es hinzufügen.

Mike Abdullah
quelle
1
Ich würde sagen, dass enumerateObjectsWithOptions: NSEnumerationReverse die beste Antwort ist, insbesondere wenn Sie wissen müssen, auf welchem ​​Index Sie sich befinden. Vielen Dank!!!
Vincil Bishop
12

Von hier aus :

 NSEnumerator* myIterator = [myArray reverseObjectEnumerator];
 id anObject;

 while( anObject = [myIterator nextObject])
 {
     /* do something useful with anObject */
 }
Naaff
quelle
2
[NsArray reverseObjectEnumerator]
CiNN
quelle
2
for (int i = ((int)[array count] - 1); i > -1; i--) {
    NSLog(@"element: %@",array[i]);
}
Vyacheslav Zubenko
quelle
Dies erkennt keine Änderungen an einer veränderlichen Array-Instanz während der Aufzählung (Elemente, Anzahl). Ansonsten wahrscheinlich etwas schneller als beim Erstellen eines NSEnumerator-Objekts.
Osxdirk