如何在 NSArray 上执行自定义排序操作。我有一个字符串数组,这是我想要的排序。
NSArray A = {cat, dog, mouse, pig, donkey}
而且我有一个未按我想要的方式排序的字符串数组。
NSArray B = {dog,cat,mouse,donkey,pig}
在不必使用键的情况下,将数组 B 与数组 A 以相同顺序放置的最佳方法是什么?
如何在 NSArray 上执行自定义排序操作。我有一个字符串数组,这是我想要的排序。
NSArray A = {cat, dog, mouse, pig, donkey}
而且我有一个未按我想要的方式排序的字符串数组。
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
是一个非常大的数字)。该算法的唯一问题是它将排序的算法复杂性乘以AO(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;
}];
添加自定义排序最好的方法是使用带函数的sostring
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;
}
查看sortedArrayUsingComparator,总是对我有用!
例子:
NSArray *sortedArray = [B sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
//Insert custom ordering code here, this will just sort alphabetically.
return [obj1 compare:obj2];
}];