按Objective-C iPhone中的数组模式排序

时间:2010-03-24 01:18:10

标签: iphone arrays nsarray mode

如果我有一个NSArray,其中包含一些值。是否有一种方法可以使用描述符按照数组中最常用的数字排序,最后使用最不频繁的数字,

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

不是没有一些额外的数据结构。

所有NSArray排序操作(sortUsingDescriptors:,sortedArrayUsingSelector:等)都假定您可以查看两个元素“a”和“b”并确定“a< b”是否不查看其中的任何其他元素NSArray的。

一种解决方案是创建一个新的Array,其成员对象包含值和频率计数(使用NSDictionary有效地计算每个值的行数)。例如:

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

然后很容易使用描述符按频率对该数组进行排序。