Сортировать NSMutableArray вложенных NSArrays по значению atIndex - PullRequest
2 голосов
/ 25 января 2012

У меня есть NSMutableArray, который содержит много NSArrays. По определенному (статическому) индексу в каждом NSArray есть значение, по которому я хотел бы отсортировать мой NSMutableArray (по убыванию / от наибольшего к наименьшему). Прямо сейчас я пытаюсь использовать NSSortDescriptor, но не могу понять, как получить и сравнить значение в моем конкретном индексе через KVC. Для уточнения:

#define INDEX_OF_DESIRED_STRING 2

NSArray *a1 = [NSArray arrayWithObjects:@"test", @"jjj", @"3454", nil]; 
NSArray *a2 = [NSArray arrayWithObjects:@"test1", @"jjj", @"12", nil]; 
NSArray *a3 = [NSArray arrayWithObjects:@"test2", @"jjj", @"232333", nil]; 
NSArray *a4 = [NSArray arrayWithObjects:@"test3", @"jjj", @".122", nil]; 

NSMutableArray *mutableA = [[NSMutableArray alloc] initWithObjects:a1, a2, a3, a4, nil]; 

// Then I'd sort with something like this... although this of course
// does not take the arrays into account. Sorts as if it were only made of strings

NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"floatValue"
                                                 ascending:NO];

[mutableA sortUsingDescriptors:[NSArray arrayWithObject:sd]]; 

1 Ответ

3 голосов
/ 25 января 2012

Попробуйте выполнить сортировку с использованием блока сравнения:

NSArray *a1 = [NSArray arrayWithObjects:@"test", @"jjj", @"3454", nil]; 
NSArray *a2 = [NSArray arrayWithObjects:@"test1", @"jjj", @"12", nil]; 
NSArray *a3 = [NSArray arrayWithObjects:@"test2", @"jjj", @"232333", nil]; 
NSArray *a4 = [NSArray arrayWithObjects:@"test3", @"jjj", @".122", nil]; 

NSMutableArray *mutableA = [[NSMutableArray alloc] initWithObjects:a1, a2, a3, a4, nil];

NSLog(@"mutableA before sorting: %@", mutableA);

[mutableA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSArray *array1 = (NSArray *)obj1;
    NSArray *array2 = (NSArray *)obj2;
    NSString *num1String = [array1 objectAtIndex:INDEX_OF_DESIRED_STRING];
    NSString *num2String = [array2 objectAtIndex:INDEX_OF_DESIRED_STRING];

    return [num1String compare:num2String];
}];

NSLog(@"mutableA after sorting: %@", mutableA);

Блок компаратора более многословен, чем мог бы быть, но я хотел, чтобы было понятно, что происходит.

...