Kann ich die Objekte in einem NSMutableArray verschieben, ohne ein temporäres Array zu schaffen?

StackOverflow https://stackoverflow.com/questions/1438101

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 brechen
War es hilfreich?

Lö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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top