2012-05-08 10 views
1

アルファベットで配列をソートする方法はわかっていますが、NSMutableArrayをその中のオブジェクトの人気度で並べ替える必要があります。次のオブジェクトと配列を想像してみて:人気度に基づいてNS(可変)配列をソート

  • B
  • C
  • B
  • B

私は人気順これらのオブジェクトをソートしたいと次のような配列を作成してください:

  • B
  • B
  • B
  • C

はこれを行うには良いと簡単な方法はありますか?多分NSSortDescriptorの鍵ですか? (それを見つけることができませんでした)

おかげ

答えて

0
NSSortDescriptor *sortDescriptor; 
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"theSortKey" 
               ascending:YES] autorelease]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
NSArray *sortedArray; 
sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors]; 

もこれはあなたのために働く必要があります

How to sort an NSMutableArray with custom objects in it?

+0

.... – Saad

0

このスレッドを参照してください。

NSArray *array = [[NSArray alloc] initWithObjects:@"A", @"A", @"B", @"B", @"B", @"C", nil]; 
NSMutableDictionary *occurenceOfValues = [[NSMutableDictionary alloc] init]; 
for (id value in array) { 
    NSNumber *count = [occurenceOfValues objectForKey:value]; 
    [occurenceOfValues setValue:[NSNumber numberWithInt:[count intValue] + 1] forKey:value]; 
} 
NSArray *valuesInOrder = [[[occurenceOfValues keysSortedByValueUsingSelector:@selector(compare:)] reverseObjectEnumerator] allObjects]; 
NSMutableArray *sortedArray = [[NSMutableArray alloc] initWithCapacity:array.count]; 
for (id value in valuesInOrder) { 
    NSNumber *count = [occurenceOfValues objectForKey:value]; 
    for (int i = 0; i < [count intValue]; i++) { 
     [sortedArray addObject:value]; 
    } 
} 
NSLog(@"%@", sortedArray); 

コンソール出力:

2012-05-08 09:20:15.805 SortArrayPopularity [25206:F803( B、 B、 B、 A、 A、C )

0

私は、B、Cは... 0

への鍵と設定されたデフォルト値として、次に列挙する目を持っている辞書を使用します対応するキーの数を増やしてください。

最後に[dict allKeys]によって返されたキー配列をソートします。

1

簡潔にするために、私は短いことに、配列リテラルの新しい構文を使用しました。 theSortKeyは、すべてのオブジェクトであると文字 'A'、 'B' を含ま

#import <Foundation/Foundation.h> 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
     NSArray *ar = @[@"B", @"A", @"C", @"B", @"B", @"A"]; 
     NSCountedSet *countedSet = [NSCountedSet setWithArray:ar]; 
     NSArray *sorted = [ar sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
      NSInteger diff = [countedSet countForObject:obj1] - [countedSet countForObject:obj2]; 
      if (diff < 0) 
       return NSOrderedDescending; 
      else if (diff > 0) 
       return NSOrderedAscending; 
      else 
       return NSOrderedSame; 
     }]; 
     NSLog(@"%@", ar); 
     NSLog(@"%@", sorted); 
    } 
    return 0; 
} 

出力

2012-05-08 07:25:18.465 Sort[20434:303] (
    B, 
    A, 
    C, 
    B, 
    B, 
    A 
) 
2012-05-08 07:25:18.468 Sort[20434:303] (
    B, 
    B, 
    B, 
    A, 
    A, 
    C 
) 
関連する問題