一時配列を作成せずにNSMutableArray内のオブジェクトをシフトできますか?

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

質問

一緒に持っていると思った

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];
    }
}

1シフトすると0,1,2,3,4が0,2,3,4,1に変わります。

期待される結果は4,0,1,2,3です

明らかな何かを見逃しているように感じます...

更新: Matthieuに感謝、これは私の機能が今どのように見えるかです。

void shiftArrayRight(NSMutableArray *mutableArray, NSUInteger shift) {
    for (NSUInteger i = shift; i > 0; i--) {
        NSObject *obj = [mutableArray lastObject];
        [mutableArray insertObject:obj atIndex:0];
        [mutableArray removeLastObject];
    }
}

一般的なNSObjectを作成し、サブクラスを追加できるとは知りませんでした。それはすべて単なるポインターなので、大丈夫だと思いますよね?

これらのオブジェクトを、バッグへのポインターではなく、バッグと考える習慣を打破することは困難です。

役に立ちましたか?

解決

次のようなものを試してください

for (NSUInteger i = shift; i > 0; i--) {
   NSObject* obj = [mutableArray lastObject];
   [mutableArray insertObject:obj atIndex:0];
   [mutableArray removeLastObject];
}

警告-そのコードはテストしていませんが、問題の解決に役立ちます。

他のヒント

アルゴリズムをもう一度確認する必要があります。ループを通過するたびに、1つのアイテムを(shift = 1の場合)次のアイテムと交換します。

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

目的の操作を実行できますが、正しい結果を得るためにステップとその依存関係を順序付ける方法について考える必要があります。些細なケースでは、最後から逆方向に作業することができます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top