【问题标题】:Can I shift the objects in a NSMutableArray without creating a temporary array?我可以在不创建临时数组的情况下移动 NSMutableArray 中的对象吗?
【发布时间】:2010-11-29 02:45:23
【问题描述】:

我以为我有它,

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,0,1,2,3?

标签: cocoa arrays nsmutablearray shift


【解决方案1】:

试试类似的东西

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 另外,值得指出的是,虽然您可以通过交换来做到这一点,但您可能不想这样做。弹出最后一个元素并将其附加到开头或创建一个新数组可能更便宜。
    最近更新 更多