Muszę odwrócić moje NSArray
.
Jako przykład:
[1,2,3,4,5]
musi stać się: [5,4,3,2,1]
Jaki jest najlepszy sposób na osiągnięcie tego?
objective-c
nsarray
Andy Jacobs
źródło
źródło
Odpowiedzi:
Aby uzyskać odwróconą kopię tablicy, spójrz na rozwiązanie danielpunkass przy użyciu
reverseObjectEnumerator
.Aby odwrócić zmienną tablicę, możesz dodać następującą kategorię do swojego kodu:
źródło
Jest o wiele łatwiejsze rozwiązanie, jeśli skorzystasz z wbudowanej
reverseObjectEnumerator
metodyNSArray
iallObjects
metodyNSEnumerator
:allObjects
jest udokumentowane jako zwracanie tablicy z obiektami, z którymi jeszcze nie wykonano przejścianextObject
, w celu:źródło
Niektóre testy porównawcze
1. reverseObjectEnumerator allObjects
To najszybsza metoda:
Wynik:
executionTime = 0.000026
2. Iteracja po reverseObjectEnumerator
Jest to od 1,5x do 2,5x wolniej:
Wynik:
executionTime = 0.000071
3. sortedArrayUsingComparator
Jest to od 30x do 40x wolniej (tutaj żadnych niespodzianek):
Wynik:
executionTime = 0.001100
Tak
[[anArray reverseObjectEnumerator] allObjects]
jest wyraźny zwycięzca, jeśli chodzi o szybkość i łatwość.źródło
enumerateObjectsWithOptions:NSEnumerationReverse
?enumerateObjectsWithOptions:NSEnumerationReverse
- najwyższy ukończono w0.000072
kilka sekund, metodę blokową w0.000009
kilka sekund.DasBoot ma właściwe podejście, ale w jego kodzie jest kilka błędów. Oto całkowicie ogólny fragment kodu, który odwróci dowolne miejsce NSMutableArray:
Możesz zawinąć to w funkcję C lub dla punktów bonusowych użyć kategorii, aby dodać ją do NSMutableArray. (W takim przypadku „tablica” zmieni się w „ja”.) Możesz także zoptymalizować ją, przypisując
[array count]
zmienną przed pętlą i używając tej zmiennej, jeśli chcesz.Jeśli masz tylko zwykły NSArray, nie ma możliwości odwrócenia go na miejscu, ponieważ NSArrays nie może być modyfikowany. Ale możesz zrobić odwróconą kopię:
Lub użyj tej małej sztuczki, aby zrobić to w jednym wierszu:
Jeśli chcesz po prostu zapętlić tablicę do tyłu, możesz użyć pętli
for
/in
z[array reverseObjectEnumerator]
, ale prawdopodobnie bardziej wydajne jest użycie-enumerateObjectsWithOptions:usingBlock:
:( Uwaga : Znacząco zaktualizowany w 2014 r. Z pięcioletnim doświadczeniem Fundacji, nową funkcją Celu C lub dwoma oraz kilkoma wskazówkami z komentarzy)
źródło
Po zapoznaniu się z odpowiedziami drugiego powyżej i znalezieniu dyskusji Matta Gallaghera tutaj
Proponuję to:
Jak zauważa Matt:
Wkrótce potem odpowiada w ten sposób:
źródło
Kategorie Georga Schölly są bardzo ładne. Jednak w przypadku NSMutableArray użycie NSUIntegers dla indeksów powoduje awarię, gdy tablica jest pusta. Prawidłowy kod to:
źródło
Najbardziej efektywny sposób wyliczenia tablicy w odwrotnej kolejności:
Zastosowanie
enumerateObjectsWithOptions:NSEnumerationReverse usingBlock
. Korzystając z powyższego testu porównawczego @ JohannesFahrenkrug, ukończono to 8 razy szybciej niż[[array reverseObjectEnumerator] allObjects];
:źródło
źródło
Odwróć tablicę i przechodź przez nią:
źródło
Aby to zaktualizować, w Swift można to łatwo zrobić za pomocą:
źródło
Co do mnie, czy zastanawiałeś się, w jaki sposób tablica była zapełniona? Byłem w trakcie dodawania WIELU obiektów do tablicy i postanowiłem wstawić każdy z nich na początku, przesuwając wszystkie istniejące obiekty o jeden. Wymaga w tym przypadku zmiennej tablicy.
źródło
Lub Scala-Way:
źródło
Jest na to łatwy sposób.
Mam nadzieję, że to pomoże.
źródło
Nie znam żadnej wbudowanej metody. Jednak ręczne kodowanie nie jest zbyt trudne. Zakładając, że elementami tablicy, z którymi mamy do czynienia, są obiekty typu NSNumber typu liczba całkowita, a „arr” to tablica NSMutableArray, którą chcemy odwrócić.
Ponieważ zaczynasz od NSArray, musisz najpierw utworzyć zmienną tablicę z zawartością oryginalnego NSArray („origArray”).
Edycja: Naprawiono n -> n / 2 w liczbie pętli i zmieniono NSNumber na bardziej ogólny id ze względu na sugestie w odpowiedzi Brenta.
źródło
Jeśli wszystko, co chcesz zrobić, to iterować w odwrotnej kolejności, spróbuj tego:
Możesz zrobić [myArrayCount] raz i zapisać go w zmiennej lokalnej (myślę, że jest droga), ale zgaduję również, że kompilator zrobi to samo z kodem, jak napisano powyżej.
źródło
Składnia Swift 3:
źródło
Spróbuj tego:
źródło
Oto ładne makro, które będzie działać dla NSMutableArray LUB NSArray:
Aby użyć wystarczy zadzwonić:
reverseArray(myArray);
źródło