6

いくつかのオブジェクトNSArrayを含む がありNSStringます。例えば:

NSArray *objects = @[@"Stin",@"Foo",@"Ray",@"Space"];

次に、次の文字列の順序に基づいて、この配列を並べ替える必要があります。

NSArray *sortOrder = @[@"John",@"Foo",@"Space",@"Star",@"Ray",@"Stin"];

だから答えは

NSArray *sorted = @[@"Foo",@"Space",@"Ray",@"Stin"];

どうすればこれを達成できますか?

ANSWER: dasblinkenlight の受け入れられた回答に基づいて、私は次のことを行いました。

NSMutableArray *objects = @[@"Star",@"Stin",@"Foo",@"Ray",@"Space",@"John"];
NSArray *sortOrder = @[@"John",@"Foo",@"Space",@"Star",@"Ray",@"Stin"];

[objects sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    int index1 = [sortOrder indexOfObject:obj1];
    int index2 = [sortOrder indexOfObject:obj2];

    if (index1 > index2)
        return NSOrderedDescending;
    if (index1 < index2)
        return NSOrderedAscending;
    return NSOrderedSame;
}];
4

2 に答える 2

6

スーパーセット配列への参照を保持し、両方の文字列NSComparatorを呼び出した結果を比較して文字列の相対的な順序を決定するCreate 。のインスタンスを渡して[superset indexOfObject:str]呼び出し、目的の順序を取得します。sortedArrayUsingComparator:NSComparator

于 2013-01-22T12:24:44.510 に答える
3

dasblinkenlightのソリューションは機能しますが、ほとんどのプログラミングの問題と同様に、それを回避する方法は複数あります。そのような代替案の1つを次に示します。

NSMutableArray *sorted = [NSMutableArray arrayWithCapacity:0];

[sortOrder enumerateObjectsUsingBlock:^(NSString *sortedString, NSUInteger idx, BOOL *stop) {
    if ([objects containsObject:sortedString]) {
        [sorted addObject:sortedString];
    }
}];

変数名は、元の質問で使用された変数名に対応しています。

これは、列挙が順番に行われるために機能します。したがって、実行されるのは、基本的に、で指定された順序で両方の配列に存在するオブジェクトのカリングですsortOrder

于 2013-01-22T12:37:56.200 に答える