NSArrayでカスタムの並べ替え操作を実行するにはどうすればよいですか。必要な順序である文字列の配列が1つあります。
NSArray A = {cat, dog, mouse, pig, donkey}
そして、私は私が望むように順序付けられていない文字列の1つの配列を持っています。
NSArray B = {dog,cat,mouse,donkey,pig}
キーを使用せずに配列Bを配列Aと同じ順序に配置するための最良の方法は何ですか?
NSArrayでカスタムの並べ替え操作を実行するにはどうすればよいですか。必要な順序である文字列の配列が1つあります。
NSArray A = {cat, dog, mouse, pig, donkey}
そして、私は私が望むように順序付けられていない文字列の1つの配列を持っています。
NSArray B = {dog,cat,mouse,donkey,pig}
キーを使用せずに配列Bを配列Aと同じ順序に配置するための最良の方法は何ですか?
これが方法です
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が大きい場合はかなり遅くなります。
あなたが持っている場合:-
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;
}];
sortedArrayUsingComparatorをチェックしてください、いつも私のために働きます!
例:
NSArray *sortedArray = [B sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
//Insert custom ordering code here, this will just sort alphabetically.
return [obj1 compare:obj2];
}];
カスタムソートを追加する最良の方法は、関数でソートを使用することです
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;
}