Kann ich die Objekte in einem NSMutableArray verschieben, ohne ein temporäres Array zu schaffen?
-
08-07-2019 - |
Frage
Ich dachte, ich hätte es mit,
void shiftArray(NSMutableArray *mutableArray, NSUInteger shift)
{
for (NSUInteger i = 0; i < [mutableArray count]; i++) {
NSUInteger newIndex = (i + shift) % [mutableArray count];
[mutableArray exchangeObjectAtIndex:i withObjectAtIndex:newIndex];
}
}
, die 0,1,2,3,4 in 0,2,3,4,1 dreht, wenn ich von einem verschieben.
Das erwartete Ergebnis ist 4,0,1,2,3
Ich fühle mich wie ich etwas fehlt bin offensichtlich ...
Update:. Dank Matthieu, das ist, was meine Funktion jetzt aussieht
void shiftArrayRight(NSMutableArray *mutableArray, NSUInteger shift) {
for (NSUInteger i = shift; i > 0; i--) {
NSObject *obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
}
Ich wusste nicht, könnten Sie eine generische NSObject machen und eine Unterklasse in ihr. Es ist nur alle Zeiger also denke ich, es ist in Ordnung, nicht wahr?
Es ist schwer, die Gewohnheit des Denkens dieser Objekte als Taschen Sachen anstatt Zeiger , um die Tasche.
zu brechenLösung
Versuchen Sie so etwas wie
for (NSUInteger i = shift; i > 0; i--) {
NSObject* obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
CAVEAT -. Ich habe diesen Code nicht getestet, aber das sollte Ihnen helfen, das Problem zu lösen
Andere Tipps
Sie müssen in Ihrem Algorithmus wieder suchen. Jedes Mal durch die Schleife, tauschen Sie ein Element mit (im Fall der Verschiebung = 1) die nächsten.
0,1,2,3,4
1 , 0 , 2,3,4
1, 2 , 0 , 3,4
1,2, 3 , 0 , 4
1,2,3, 4 , 0
0 , 2,3,4, 1
Sie können den Vorgang tun Sie tun möchten, aber Sie müssen darüber nachdenken, wie die Schritte und deren Abhängigkeiten bestellen das richtige Ergebnis zu erhalten. Im trivialen Fall können Sie nur arbeiten rückwärts vom Ende.
0,1,2,3,4
4 , 1,2,3, 0
4,1,2, 0 , 3
4,1, 0 , 2 , 3
4, 0 , 1 , 2,3