2009-09-17 7 views
7

Ich dachte, ich es mit,Kann ich die Objekte in einem NSMutableArray verschieben, ohne ein temporäres Array zu erstellen?

hatte
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 offensichtlich etwas fehlt bin ...

Update: Dank Matthieu, das, was meine Funktion aussieht, ist wie jetzt.

Ich wusste nicht, dass Sie ein generisches NSObject erstellen und eine Unterklasse darin einfügen könnten. Es ist alles nur ein Hinweis, also denke ich, es ist in Ordnung, oder?

Es ist schwer, die Gewohnheit des Denkens dieser Objekte als Taschen Sachen anstatt Zeiger, um die Tasche zu brechen.

+0

Was ist das erwartete Ergebnis, wenn Sie um eins schalten? 4,0,1,2,3? – mrueg

Antwort

13

Probieren Sie 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 Sie das Problem lösen helfen.

3

Sie müssen sich erneut Ihren Algorithmus ansehen. Jedes Mal, wenn Sie die Schleife durchlaufen, tauschen Sie einen Gegenstand mit (im Falle von Schicht = 1) den nächsten aus.

0,1,2,3,4
, , 2,3,4
1, 2 , 0, 3,4
1,2, , 0, 4
1,2,3, 4 ,
, 2,3,4,

Sie den Betrieb tun können, was Sie tun wollen, aber Sie müssen darüber, wie Sie bestellen die Schritte und deren Abhängigkeiten denken, das richtige Ergebnis zu bekommen. Im trivialen Fall können Sie einfach rückwärts arbeiten.

0,1,2,3,4
, 1,2,3,
4,1,2, ,
4,1, , 2, 3
4, , , 2,3

+2

Es lohnt sich auch, darauf hinzuweisen, dass Sie es möglicherweise nicht möchten, obwohl Sie es mit Swaps machen können. Das letzte Element abzufangen und an den Anfang zu hängen oder ein neues Array zu erstellen, ist wahrscheinlich billiger. – masto

Verwandte Themen