Сортировать по режиму в массиве в Objective-C iPhone - PullRequest
2 голосов
/ 24 марта 2010

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

Array has(
"3",
"2",
"1",
"3",
"3",
"7",
)

до

Array has(
"3",
"3",
"3",
"1",
"2",
"7",
)

Ответы [ 2 ]

4 голосов
/ 24 марта 2010
@interface NSArray (Ext)
-(NSArray*) sortByMostFrequent ;
@end



@implementation NSArray (Ext)
-(NSArray*) sortByMostFrequent {
    NSMutableDictionary* frequencyDict = [NSMutableDictionary dictionary];
    for (id obj in self) {
        int frequency = [[frequencyDict valueForKey:obj] intValue];
        [frequencyDict setValue:[NSNumber numberWithInt:frequency+1] forKey:obj];
    }
    NSMutableArray* ary = [NSMutableArray arrayWithCapacity:self.count];
    for (id obj in self) {
        [ary addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                        obj, @"Object",
                        [frequencyDict valueForKey:obj], @"Frequency",
                        nil]];
    }
    NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Frequency" ascending:NO];
    [ary sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    [sortDescriptor release];
    return [ary valueForKey:@"Object"];
}
@end



/// example
NSArray* ary = [NSArray arrayWithObjects:@"3", @"2", @"1", @"3", @"3", @"7", nil];
NSLog(@"ary %@", [ary sortByMostFrequent]);
0 голосов
/ 24 марта 2010

Не без некоторых дополнительных структур данных.

Все операции сортировки NSArray (sortUsingDescriptors :, sortedArrayUsingSelector: и т. Д.) Предполагают, что вы можете посмотреть на два элемента "a" и "b" и определить, является ли "a Одним из решений было бы создание нового массива, чьи объекты-члены содержат и значение, и счетчик частоты (используйте NSDictionary для эффективного подсчета количества строк для каждого значения). Например:

Array( // {value, frequency}
{3,3},
{2,1},
{1,1},
{3,3},
{3,3},
{7,1}
)

Тогда легко использовать дескриптор для сортировки этого массива по частоте.

...