iPhoneアプリ作成(9) 配列をグループングして件数をカウント

データベースなら、SQLで簡単にできる「グルーピング」ですが、
配列を「グルーピング」して「件数をカウント」する便利は標準的なクラスは無いみたい...

と、いうことで「Array配列をグループングして件数をカウント」するサンプルソースを作ってみました。

#import <Foundation/Foundation.h>

//sortの比較関数
NSInteger stringSort(id obj1, id obj2, void *context){
NSInteger ret;
     if (context)ret = [obj2 compare:obj1]; //降順
     else        ret = [obj1 compare:obj2]; //昇順
     return ret;
}

int main (int argc, constchar * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

  //配列を作成する
  NSMutableArray *array = [NSMutableArray array];
  [array addObject:@"A"];
  [array addObject:@"2"];
  [array addObject:@"a"];
  [array addObject:@"B"];
  [array addObject:@"A"];
  [array addObject:@"1"];
  [array addObject:@"2"];

  NSLog(@"total count = %d",[array count]);

  //配列を単一化する
  NSMutableSet *set = [NSMutableSet set];
  for(id value in array)[set addObject:value];

  //単一化された値をキーにして、件数を格納できる辞書を作成する
  NSMutableDictionary *dic = [NSMutableDictionary dictionary];
  for(id key in set)[dic setObject:[NSNumber numberWithInt:0] forKey:key];

  //単一化されたキー毎の件数をカウントする
  for(id key in set){
    for(id value in array)
      if (key == value) {
        int cnt = [[dic objectForKey:key]intValue] +1;
        [dic setObject:[NSNumber numberWithInt:cnt] forKey:key];
      }
  }

  //単一化されたキーを昇順にソートする
  NSMutableArray *array2 = [NSMutableArray array];
  for(id value in set)[array2 addObject:value];
  [array2 sortUsingFunction:stringSort context:(void*)0];

  //キー毎の件数を表示する
  for(id key in array2)NSLog(@"%@ = %d",key,[[dic objectForKey:key]intValue]); 

  [pool drain];
  return0;
}

◆結果

2011-03-17 15:41:14.919 tempTest[7835:a0f] total count = 7
2011-03-17 15:41:14.924 tempTest[7835:a0f] 1 = 1
2011-03-17 15:41:14.925 tempTest[7835:a0f] 2 = 2
2011-03-17 15:41:14.925 tempTest[7835:a0f] A = 2
2011-03-17 15:41:14.926 tempTest[7835:a0f] B = 1
2011-03-17 15:41:14.932 tempTest[7835:a0f] a = 1

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です