Wie kann ich ein NSArray in Objective-C umkehren?
Ich umkehren müssen, meine NSArray
.
Als Beispiel:
[1,2,3,4,5]
werden muss: [5,4,3,2,1]
Was ist der beste Weg, dies zu erreichen?
Kommentar zu dem Problem
Es ist auch lohnt ein Blick auf: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Collections/Articles/sortingFilteringArrays.html die Ihnen sagt wie sortiert ein array in umgekehrter Reihenfolge (das ist üblicherweise das, was Sie tun, zum Beispiel in ein array verwenden, abgeleitet von NSDictionary#allKeys, und Sie wollen umkehren Datum/alpha, um zu dienen als Gruppierung für UITable auf iPhone, etc).
InformationsquelleAutor der Frage Andy Jacobs | 2009-02-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur Erlangung eine umgekehrte Kopie eines Arrays, Blick auf danielpunkass' Lösung mit
reverseObjectEnumerator
.Umkehrung ein veränderliches array, können Sie fügen Sie die folgende Kategorie-code:
InformationsquelleAutor der Antwort Georg Schölly
Gibt es eine viel einfachere Lösung, wenn Sie die Vorteile der integrierten
reverseObjectEnumerator
Methode aufNSArray
, und dieallObjects
Methode derNSEnumerator
:allObjects
dokumentiert ist als Rückgabe ein array mit den Objekten, die noch nicht durchquert mitnextObject
:InformationsquelleAutor der Antwort danielpunkass
Einige benchmarks
1. reverseObjectEnumerator allObjects
Dies ist die Schnellste Methode:
Ergebnis:
executionTime = 0.000026
2. Iteration über eine reverseObjectEnumerator
Dieser ist zwischen 1,5 x und 2,5 x langsamer:
Ergebnis:
executionTime = 0.000071
3. sortedArrayUsingComparator
Dies ist zwischen 30x und 40x langsamer (keine überraschungen hier):
Ergebnis:
executionTime = 0.001100
So
[[anArray reverseObjectEnumerator] allObjects]
ist der klare Sieger, wenn es um Geschwindigkeit und Leichtigkeit.InformationsquelleAutor der Antwort Johannes Fahrenkrug
DasBoot hat den richtigen Ansatz, aber es gibt ein paar Fehler in seinem code. Hier ist ein völlig generischen code-snippet, das wird in umgekehrter jede NSMutableArray in Ort:
Umgebrochen werden kann, die in einer C-Funktion, oder für bonus-Punkte, verwenden Sie Kategorien, fügen Sie es zu NSMutableArray. (In diesem Fall, 'array' würde 'selbst'.) Sie können auch optimieren Sie Ihre it durch die Zuordnung
[array count]
eine variable schon vor der Schleife und die Verwendung dieser Variablen, wenn Sie es wünschen.Wenn Sie nur eine regelmäßige NSArray, es gibt keinen Weg, um es rückgängig zu machen in Platz, weil NSArrays können nicht geändert werden. Aber Sie können eine umgekehrte Kopie:
Oder verwenden Sie den trick, es zu tun in einer Zeile:
Wenn Sie nur wollen, um die Schleife über ein array rückwärts, können Sie eine
for
/in
Schleife mit[array reverseObjectEnumerator]
, aber es ist wahrscheinlich ein bisschen effizienter zu nutzen-enumerateObjectsWithOptions:usingBlock:
:(Hinweis: Wesentlich aktualisiert in 2014 mit mehr als fünf Jahre Stiftung Erfahrung, eine neue Objective-C-Funktion oder zwei, und ein paar Tipps aus den Kommentaren.)
InformationsquelleAutor der Antwort Brent Royal-Gordon
Sich nach der Durchsicht der anderen Antworten oben und die Suche nach Matt Gallagher ' s die Diskussion hier
Schlage ich vor:
Als Matt merkt an:
Kurz danach, antwortet er so:
InformationsquelleAutor der Antwort Aeronin
Georg Schölly Kategorien sind sehr nett. Jedoch, für NSMutableArray, mit NSUIntegers für die Indizes führt zu einem Absturz, wenn das array leer ist. Der richtige code lautet:
InformationsquelleAutor der Antwort Werner Jainek
InformationsquelleAutor der Antwort Jayprakash Dubey
Der effizienteste Weg, um aufzuzählen, ein array in umgekehrter Richtung:
Verwenden
enumerateObjectsWithOptions:NSEnumerationReverse usingBlock
. @JohannesFahrenkrug-benchmark vor, diese abgeschlossen 8x schneller als[[array reverseObjectEnumerator] allObjects];
:InformationsquelleAutor der Antwort brandonscript
Reverse array und Durchlaufen es:
InformationsquelleAutor der Antwort Aqib Mumtaz
Zu aktualisieren, Swift, es kann getan werden einfach mit:
InformationsquelleAutor der Antwort Julio Vasquez
Als für mich, haben Sie sich überlegt, wie das array war gefüllt in den ersten Platz? Ich war in den Prozess des Hinzufügens VIELE Objekte in ein array, und beschlossen, legen Sie jeweils eine am Anfang, drängen alle vorhandenen Objekte durch. Erfordert ein veränderliches array, in diesem Fall.
InformationsquelleAutor der Antwort James Perih
Oder die Scala-Art:
InformationsquelleAutor der Antwort Hugo Stieglitz
Ich kenne keine eingebaute Methode.
Aber, Codierung von hand ist nicht zu schwer. Vorausgesetzt, die Elemente des Arrays, die Sie beschäftigen, sind NSNumber-Objekte vom Typ integer, und 'arr' ist die NSMutableArray, das Sie stornieren möchten.
Da Sie beginnen mit einem NSArray dann erstellen Sie das mutable-array zuerst mit dem Inhalt des ursprünglichen NSArray ('origArray').
Edit: Fixierte n -> n/2 in der Schleife zählen und geändert NSNumber, um die generische id aufgrund der Anregungen in Brent ' s Antwort.
InformationsquelleAutor der Antwort Himadri Choudhury
Wenn alles, was Sie tun möchten, Durchlaufen in umgekehrter, versuchen Sie dies:
Können Sie die [myArrayCount] einmal, und speichern Sie es in eine lokale variable (ich glaube, seine teuer), aber ich bin auch vermute, dass der compiler ziemlich viel zu tun die gleiche Sache mit dem code wie oben geschrieben.
InformationsquelleAutor der Antwort DougPA
Swift 3 syntax :
InformationsquelleAutor der Antwort fethica
Versuchen Sie dies:
InformationsquelleAutor der Antwort Shashank shree
Gibt es eine einfache Möglichkeit, es zu tun.
Ich hoffe, das hilft.
InformationsquelleAutor der Antwort vroldan