如果我有一个NSArray,其中包含一些值。是否有一种方法可以使用描述符按照数组中最常用的数字排序,最后使用最不频繁的数字,
Array has(
"3",
"2",
"1",
"3",
"3",
"7",
)
到
Array has(
"3",
"3",
"3",
"1",
"2",
"7",
)
答案 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}
)
然后很容易使用描述符按频率对该数组进行排序。