Objective-C, сортировка многомерных массивов - PullRequest
1 голос
/ 24 мая 2011

У меня были некоторые проблемы с сортировкой многомерных массивов в 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-е значение массива, который я передаю?Большое спасибо

1016 * Большое спасибо

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

в большинстве случаев вы бы создали объект:

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

затем научите его сравнивать себя с другими, затем используйте эти объекты в массиве. логическая организация данных и реализация.

2 голосов
/ 24 мая 2011

Вы также можете использовать метод на основе блоков sortUsingComparator: в NSMutableArray, как это -

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

    return [firstObject compare:secondObject];
}]

У вас также есть параллельный метод sortedArrayUsingComparator: в NSArray, который выдает отсортированный массив.

Сортировка по разным показателям

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])];

В зависимости от переданного индекса, массив будет сортироваться на основе объектов с этим индексом. Это довольно простой код, но вы можете добавить к этому.

...