如何在NSArray上使用自定义排序

时间:2012-08-03 10:06:16

标签: objective-c ios nsarray

如何在NSArray上执行自定义排序操作​​。我有一个字符串数组,这是我想要的订单。

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

我有一个字符串数组,没有按照我想要的方式排序。

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

最好的方法是将数组B放在与数组A相同的顺序而不必使用密钥?

4 个答案:

答案 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; }