Ich muss meine umkehren NSArray
.
Als Beispiel:
[1,2,3,4,5]
muss werden: [5,4,3,2,1]
Was ist der beste Weg, um dies zu erreichen?
objective-c
nsarray
Andy Jacobs
quelle
quelle
Antworten:
Um eine umgekehrte Kopie eines Arrays zu erhalten, schauen Sie sich die Lösung von danielpunkass mit an
reverseObjectEnumerator
.Um ein veränderliches Array umzukehren, können Sie Ihrem Code die folgende Kategorie hinzufügen:
quelle
Es gibt eine viel einfachere Lösung, wenn Sie die integrierte
reverseObjectEnumerator
Methode nutzenNSArray
und dieallObjects
MethodeNSEnumerator
:allObjects
Es wird dokumentiert , dass ein Array mit den Objekten zurückgegeben wird, die noch nicht durchlaufen wurdennextObject
, und zwar in der folgenden Reihenfolge:quelle
Einige Benchmarks
1. reverseObjectEnumerator allObjects
Dies ist die schnellste Methode:
Ergebnis:
executionTime = 0.000026
2. Iterieren über einen reverseObjectEnumerator
Dies ist zwischen 1,5x und 2,5x langsamer:
Ergebnis:
executionTime = 0.000071
3. sortierterArrayUsingComparator
Dies ist zwischen 30x und 40x langsamer (keine Überraschungen hier):
Ergebnis:
executionTime = 0.001100
So
[[anArray reverseObjectEnumerator] allObjects]
ist der klare Gewinner, wenn es um Geschwindigkeit und Leichtigkeit geht.quelle
enumerateObjectsWithOptions:NSEnumerationReverse
?enumerateObjectsWithOptions:NSEnumerationReverse
- den obersten in0.000072
Sekunden, die Blockmethode in0.000009
Sekunden.DasBoot hat den richtigen Ansatz, aber sein Code enthält einige Fehler. Hier ist ein vollständig generisches Code-Snippet, das alle vorhandenen NSMutableArray umkehrt:
Sie können dies in eine C-Funktion einschließen oder für Bonuspunkte Kategorien verwenden, um es zu NSMutableArray hinzuzufügen. (In diesem Fall wird 'array' zu 'self'.) Sie können es auch optimieren, indem Sie
[array count]
einer Variablen vor der Schleife zuweisen und diese Variable verwenden, wenn Sie dies wünschen.Wenn Sie nur ein reguläres NSArray haben, können Sie es nicht umkehren, da NSArrays nicht geändert werden können. Sie können jedoch eine umgekehrte Kopie erstellen:
Oder verwenden Sie diesen kleinen Trick, um es in einer Zeile zu tun:
Wenn Sie ein Array nur rückwärts durchlaufen möchten, können Sie eine
for
/in
-Schleife mit verwenden[array reverseObjectEnumerator]
, die Verwendung ist jedoch wahrscheinlich etwas effizienter-enumerateObjectsWithOptions:usingBlock:
:( Hinweis : Im Jahr 2014 mit fünf weiteren Jahren Foundation-Erfahrung, ein oder zwei neuen Objective-C-Funktionen und einigen Tipps aus den Kommentaren erheblich aktualisiert.)
quelle
Nachdem Sie die Antworten des anderen oben überprüft und Matt Gallaghers Diskussion hier gefunden haben
Ich schlage vor:
Wie Matt bemerkt:
Kurz darauf antwortet er folgendermaßen:
quelle
Georg Schöllys Kategorien sind sehr schön. Bei NSMutableArray führt die Verwendung von NSUIntegern für die Indizes jedoch zu einem Absturz, wenn das Array leer ist. Der richtige Code lautet:
quelle
Der effizienteste Weg, ein Array in umgekehrter Reihenfolge aufzulisten:
Verwenden Sie
enumerateObjectsWithOptions:NSEnumerationReverse usingBlock
. Mit dem obigen Benchmark von @ JohannesFahrenkrug wurde dies 8x schneller abgeschlossen als[[array reverseObjectEnumerator] allObjects];
:quelle
quelle
Array umkehren und durchlaufen:
quelle
Um dies zu aktualisieren, kann dies in Swift einfach durchgeführt werden mit:
quelle
Haben Sie sich überlegt, wie das Array überhaupt gefüllt wurde? Ich war gerade dabei, einem Array VIELE Objekte hinzuzufügen, und entschied mich, jedes am Anfang einzufügen und alle vorhandenen Objekte um eins nach oben zu verschieben. Erfordert in diesem Fall ein veränderbares Array.
quelle
Oder der Scala-Weg:
quelle
Es gibt einen einfachen Weg, dies zu tun.
Ich hoffe das hilft.
quelle
Ich kenne keine eingebaute Methode. Das Codieren von Hand ist jedoch nicht allzu schwierig. Angenommen, die Elemente des Arrays, mit denen Sie sich befassen, sind NSNumber-Objekte vom Typ Integer, und 'arr' ist das NSMutableArray, das Sie umkehren möchten.
Da Sie mit einem NSArray beginnen, müssen Sie zuerst das veränderbare Array mit dem Inhalt des ursprünglichen NSArray ('origArray') erstellen.
Bearbeiten: n -> n / 2 in der Schleifenzahl behoben und NSNumber aufgrund der Vorschläge in Brents Antwort in die allgemeinere ID geändert.
quelle
Wenn Sie nur in umgekehrter Reihenfolge iterieren möchten, versuchen Sie Folgendes:
Sie können [myArrayCount] einmal ausführen und in einer lokalen Variablen speichern (ich denke, es ist teuer), aber ich vermute auch, dass der Compiler mit dem oben beschriebenen Code so ziemlich dasselbe tun wird.
quelle
Swift 3-Syntax:
quelle
Versuche dies:
quelle
Hier ist ein schönes Makro , das für beide NSMutableArray arbeiten ODER NSArray:
Um zu verwenden, rufen Sie einfach an:
reverseArray(myArray);
quelle