7

我以为我有它,

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 并在其中放入一些子类。这一切都只是指针,所以我想没关系,对吧?

很难打破将这些对象视为袋子而不是指向袋子的指针的习惯。

4

2 回答 2

13

尝试类似的东西

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

警告——我没有测试过该代码,但这应该可以帮助您解决问题。

于 2009-09-17T12:06:10.443 回答
3

您需要再次查看您的算法。每次通过循环,您将一项与(在 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

于 2009-09-17T13:12:59.137 回答