5

私はNSMutableArray持ち株をNSStrings持っています。{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

ラッピングで要素を移動できるようにしたいと思います。

したがって、たとえば 1 を中央に移動し、すべての要素をシフトし、残りの要素 (境界を越える) を最初にラップします。逆も同様です。たとえば、10 を中央に移動します。

{7, 8, 9, 10, 1, 2, 3, 4, 5, 6}{6, 7, 8, 9, 10, 1, 2, 3, 4, 5}

このような最適化されたsort方法は既に存在しますか?

4

5 に答える 5

2

最も効率的な方法は、配列の現在の「原点」を維持し、長さを法としてその原点を追加することによってインデックスを再解釈するラッパー オブジェクトを作成することです。実際、配列がほんの一握りの場所でしかアクセスされない場合、これはインラインの 1 ~ 2 行のコードで簡単に実行できます。

-(id)objectForIndex:(NSInteger) index {
    NSInteger realIndex = (origin + index) % array.count;
    return [array objectAtIndex:realIndex];
}

(これが NS(Mutable)Array を拡張する場合、"array" は "super" です。ラッパーのみの場合、"array" はインスタンス変数です。"origin" はいずれの場合もインスタンス変数/プロパティです。)

于 2013-06-07T11:24:38.870 に答える
2

私はNSArrayこれに関する方法を知りませんが、次のとおりです。

static NSArray *shiftArray(NSArray *array, NSInteger pos)
{
    NSInteger length = [array count];
    NSArray *post = [array subarrayWithRange:(NSRange){ .location = length - pos, .length = pos }];
    NSArray *pre = [array subarrayWithRange:(NSRange){ .location = 0, .length = length - pos}];
    return [post arrayByAddingObjectsFromArray:pre];
}

例えば:

NSArray *array = @[@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I"];
NSLog(@"array = %@",shiftArray(array, 4));

あなたが説明することをするべきです。

コンソールへのログ:

array = (
    F,
    G,
    H,
    I,
    A,
    B,
    C,
    D,
    E
)

パフォーマンスが良くない可能性があります。

于 2013-06-07T11:17:08.993 に答える
1
-(NSArray*)shiftForward:(BOOL)forward withbits:(int)bit
{
    NSInteger length = [array count];
    NSArray *right;
    NSArray *left;

    if (forward) {
        //code for right shift
        right = [array subarrayWithRange:(NSRange){ .location = length - bit, .length = bit }];
        left = [array subarrayWithRange:(NSRange){ .location = 0, .length = length - bit}];
        return [right arrayByAddingObjectsFromArray:left];
    }else{
        //code for left shift
        left = [array subarrayWithRange:(NSRange){ .location =0, .length = bit }];
        right= [array subarrayWithRange:(NSRange){ .location = bit, .length = length - bit}];
        return [right arrayByAddingObjectsFromArray:left];
    }
}

- (void)viewDidLoad
{
    array = @[@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9"];
    NSLog(@"array is %@",[self shiftForward:YES withbits:3]);
}
于 2013-06-07T11:45:42.933 に答える
0

確かに、Nラップアラウンドする必要がある要素によってシフトしている場合、最後のN配列要素を取得してそれらを前面に貼り付けるだけですか?

逆にシフトする場合は、前を取り、後ろに置きます。

于 2013-06-07T11:16:25.683 に答える