1

NSArrayでカスタムの並べ替え操作を実行するにはどうすればよいですか。必要な順序である文字列の配列が1つあります。

NSArray A = {cat, dog, mouse, pig, donkey}

そして、私は私が望むように順序付けられていない文字列の1つの配列を持っています。

NSArray B = {dog,cat,mouse,donkey,pig}

キーを使用せずに配列Bを配列Aと同じ順序に配置するための最良の方法は何ですか?

4

4 に答える 4

7

これが方法です

NSArray *sortedArray = [B sortedArrayUsingComparator: ^(id obj1, id obj2){
    NSUInteger index1 = [A indexOfObject: obj1];
    NSUInteger index2 = [A indexOfObject: obj2];
    NSComparisonResult ret = NSOrderedSame;
    if (index1 < index2)
    {
        ret = NSOrderedAscending;
    }
    else if (index1 > index2)
    {
        ret = NSOrderedDescending;
    }
    return ret;
}];

上記は、Bの要素をAと同じ順序にソートし、Bにはあるが、Aにはない要素が最後に表示されます(NSNotFound非常に大きな数であるため)。アルゴリズムの唯一の問題は、ソートのアルゴリズムの複雑さをA内のオブジェクトの数で乗算することですO(n)nしたがって、Aが大きい場合はかなり遅くなります。

于 2012-08-03T10:35:25.697 に答える
3

あなたが持っている場合:-

NSArray A = {cat, dog, mouse, pig, donkey}

NSMutableArray B = {dog,cat,mouse,donkey,pig}

使用できます:-

[B sortArrayUsingComparator:^NSComparisonResult(NSString *obj1,   NSString *obj2) {
    NSUInteger indexOfObj1 = [A indexOfObject: obj1];
    NSUInteger indexOfObj2 = [A indexOfObject: obj2];
    if(indexOfObj1 == NSNotFound || indexOfObj2 == NSNotFound){
        return NSOrderedSame;
    }
    else if(indexOfObj1 > indexOfObj2){
        return NSOrderedDescending;
    }

    return NSOrderedAscending;
}];
于 2012-08-03T10:38:31.987 に答える
0

sortedArrayUsingComparatorをチェックしてください、いつも私のために働きます!

例:

NSArray *sortedArray = [B sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1,   NSString *obj2) {
    //Insert custom ordering code here, this will just sort alphabetically.
    return [obj1 compare:obj2];
}];
于 2012-08-03T10:21:20.740 に答える
0

カスタムソートを追加する最良の方法は、関数でソートを使用することです

NSArray *B=[A sortedArrayUsingFunction:sortingFunction context:nil];
//  sortingFunction

NSInteger sortingFunction( id obj1, id obj2, void *context){ if ( //your condition ){ return NSOrderedDescending; } if ( //your condition){ return NSOrderedAscending; } return NSOrderedSame; }

于 2012-08-03T10:27:46.473 に答える