0

次のようなNSMutableArrayがあるとします。

オブジェクト0オブジェクト1オブジェクト2オブジェクト3オブジェクト4

オブジェクト0とオブジェクト1を取得して、オブジェクト4の後ろに移動します。

オブジェクト2オブジェクト3オブジェクト4オブジェクト0オブジェクト1

複数のオブジェクトの並べ替えを実現するためのこのかなり長いコードがありますが、もっと簡単でエレガントな方法があるかどうか疑問に思いました。

    int from = 0;
    int to = 5;
    int lastIndexOfObjectsToBeMoved = 1;    
    NSMutableArray *objectsToBeMoved = [[NSMutableArray alloc] init];
    for (int i = from; i < lastIndexOfObjectsToBeMoved; i++) {
        object *o = [self.objects objectAtIndex:i];
        [objectsToBeMoved addObject:o];
    }

    NSUInteger length = lastIndexOfObjectsToBeMoved-from;
    NSRange indicesToBeDeleted = NSMakeRange(from, length);
    [self.objects removeObjectsInRange:indicesToBeDeleted];


    NSIndexSet *targetIndices = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(to, length)];
    [self.objects insertObjects:objectsToBeMoved atIndexes:targetIndices];

編集:申し訳ありませんが、明確にする必要があります。私は常にオブジェクトを最後まで移動しているわけではありませんが、オブジェクト2と3をインデックス0に移動するなどのこともできるようにしたいと考えています。

4

2 に答える 2

3

後ろに移動するインデックスのNSRangeを作成します。でこれらのオブジェクトを取得しsubarrayWithRange、で削除して、removeObjectsInRange:を呼び出して最後に追加しますaddObjectsFromArray:。これはあなたが持っているものを書くためのはるかに簡潔な方法です。

于 2012-07-24T09:08:36.413 に答える
0

rowIndexesは、移動したいオブジェクトを含むNSIndexSetです。

行はインデックスの宛先です

NSArray *objectsToMove = [your_array objectsAtIndexes: rowIndexes];

// If any of the removed objects come before the row
// we want to decrement the row appropriately
row -= [rowIndexes countOfIndexesInRange: (NSRange){0, row}];

[your_array removeObjectsAtIndexes:rowIndexes];
[your_array replaceObjectsInRange: (NSRange){row, 0}
       withObjectsFromArray: objectsToMove];

これがお役に立てば幸いです

于 2013-02-01T11:17:54.323 に答える