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.


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


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.


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 */
 }


2
for (int i = ((int)[array count] - 1); i > -1; i--) {
    NSLog(@"element: %@",array[i]);
}

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
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.