2010-03-24 9 views
2

Si j'ai un NSArray avec des valeurs. Est-il possible en utilisant des descripteurs pour trier par le nombre le plus fréquent dans le tableau premier et le moins fréquent à la fin,Trier par le mode dans un tableau dans Objective-C iPhone

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

à

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

Répondre

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

Non sans quelques structures de données supplémentaires. Toutes les opérations de tri de NSArray (sortUsingDescriptors :, sortedArrayUsingSelector :, etc.) supposent que vous pouvez regarder deux éléments "a" et "b" et déterminer si "< b" sans regarder aucun autre élément dans le NSArray.

Une solution serait de créer un nouveau tableau dont les objets membres contiennent à la fois la valeur et le nombre de fréquence (utilisez un NSDictionary pour compter efficacement le nombre de lignes pour chaque valeur). Par exemple:

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

Ensuite, il est facile d'utiliser un descripteur pour trier ce tableau par fréquence.