如何在NSArray上执行自定义排序操作。我有一个字符串数组,这是我想要的订单。
NSArray A = {cat, dog, mouse, pig, donkey}
我有一个字符串数组,没有按照我想要的方式排序。
NSArray B = {dog,cat,mouse,donkey,pig}
最好的方法是将数组B放在与数组A相同的顺序而不必使用密钥?
答案 0 :(得分: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
是一个非常大的数字)。该算法的唯一问题是它将排序的算法复杂度乘以O(n)
,其中n
是A中的对象数。因此,对于大A,它将非常慢。
答案 1 :(得分: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;
}];
答案 2 :(得分: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];
}];
答案 3 :(得分:0)
添加自定义排序最好的方法是使用sotring with function
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;
}