Objective-C,排序多维数组

时间:2011-05-23 20:59:07

标签: objective-c sorting nsarray

我在Objective-C中排序多维数组时遇到了一些麻烦。我基本上有一个数组,其中每个元素都是一个形式的数组:

(NSString, NSDate, NSString, NSString)

这样我的顶级数组的格式为:

(
(NSString, NSDate, NSString, NSString),
(NSString, NSDate, NSString, NSString),
(NSString, NSDate, NSString, NSString),
(NSString, NSDate, NSString, NSString),
...
)

我希望能够根据自己的任何元素对顶级数组的元素进行排序。我编写了以下代码来执行此操作,但事实证明,对于我正在处理的大型数据集来说效率太低了。

-(NSMutableArray *) sortArrayByDate:(NSMutableArray *) unsortedArray {

    NSMutableArray * sortedArray = [[NSMutableArray alloc ] init ];

    while ([unsortedArray count]>0) {
        int topIndex = 0;
        NSDate * topDate = [[NSDate alloc] initWithString:@"1970-01-01 00:00:00 +0600"];
        for(int j=0;j<[unsortedArray count];j++) {
            NSDate * targetDate = [[unsortedArray objectAtIndex:j] objectAtIndex:1];
            if ([targetDate compare:topDate] == NSOrderedDescending) {
                topDate = targetDate;
                topIndex = j;
            }            
        }
        [sortedArray addObject:[unsortedArray objectAtIndex:topIndex]];
        [unsortedArray removeObjectAtIndex:topIndex];        
    }    
    return sortedArray;
}

任何人都可以使用sortUsingSelector或sortUsingDescriptor的更成熟的方法提出如何完成此任务的建议吗?如果我正在排序一维数组,我认为它会是这样的:

[unsortedArray sortUsingSelector: @selector(compare:)]

但是如何告诉它使用我传递的数组的第n个值进行排序?

- 非常感谢

- 很感谢

2 个答案:

答案 0 :(得分:3)

在大多数情况下,您会创建一个对象:

@interface MONObject : NSObject
{
  NSString * a;
  NSDate * b;
  NSString * c;
  NSString * d;
}
...

然后教它将自己与其他人进行比较,然后在数组中使用这些对象。数据和实施的逻辑组织。

答案 1 :(得分:2)

您还可以在NSMutableArray中使用基于块的方法sortUsingComparator:,如下所示 -

[myArray sortUsingComparator:^(id first, id second){
    id firstObject = [first objectAtIndex:1];
    id secondObject = [second objectAtIndex:1];

    return [firstObject compare:secondObject];
}]

NSArray中还有一个并行方法sortedArrayUsingComparator:,它将显示一个已排序的数组。

按索引排序

typedef NSComparator (^ComparatorFactory)(id);

ComparatorFactory comparatorForIndex = ^NSComparator(id context) {
    NSInteger index = [(NSNumber*)context integerValue];
    NSComparator comparator = ^(id first, id second) {
        id firstObject = [first objectAtIndex:index];
        id secondObject = [second objectAtIndex:index];

        return [firstObject compare:secondObject];
    };

    return [[comparator copy] autorelease];
};

[myArray sortUsingComparator:comparatorForIndex([NSNumber numberWithInteger:1])];

根据传递的索引,数组将根据该索引处的对象进行排序。这是非常基本的代码,但您可以添加到此。