我能否在NSMutableArray中移动对象而不创建临时数组?

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

当我向右移动一位时,将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,0,1,2,3? - mrueg
2个回答

13

尝试类似以下的内容

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

注意-- 我没有测试过那段代码,但它应该能帮助你解决问题。


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


2
另外值得指出的是,虽然你可以使用交换来实现,但你可能不想这样做。弹出最后一个元素并将其附加到开头或创建一个新数组可能更便宜。 - masto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接