1

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

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

而且我有一个未按我想要的方式排序的字符串数组。

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是一个非常大的数字)。该算法的唯一问题是它将排序的算法复杂性乘以AO(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

添加自定义排序最好的方法是使用带函数的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; }

于 2012-08-03T10:27:46.473 回答
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 回答