NSDictionaryを含むNSArrayを、NSDictionaryの特定のキーでソートしたい時があるかと思います。
例えば、NSDctionaryの数値が値になる「English」というキーで配列をソートしてみます。
誰が英語の点数が良かったかを出力しようかと思います。
まず、教科ごとの点数と名前を持つNSDictionaryの配列を用意
NSDictionary* yamachan = [[NSDictionary alloc] initWithObjects: @[@"山ちゃん", @"80", @"30"] forKeys: @[@"Name", @"English", @"Mathmatics"]]; NSDictionary* okamato = [[NSDictionary alloc] initWithObjects: @[@"岡本", @"67", @"60"] forKeys: @[@"Name", @"English", @"Mathmatics"]]; NSDictionary* yamane = [[NSDictionary alloc] initWithObjects: @[@"山根", @"40", @"20"] forKeys: @[@"Name", @"English", @"Mathmatics"]]; NSArray* students = @[yamachan, okamato, yamane];
次にこの配列を英語の点数順にソートします。
NSArray* sorted_students = [students sortedArrayUsingFunction:compareFloat context:NULL];
ソートするには、「sortedArrayUsingFunction: context:」がキモ。
第1引数は、比較を行うためのC言語の関数を定義
第2引数は、第1引数で指定した関数の引数を定義
比較を行う関数は以下です。
NSComparisonResult compareFloat(id value1, id value2, void *context) { float floatValue1 = [(NSNumber*)[value1 valueForKey: @"English"] floatValue]; float floatValue2 = [(NSNumber*)[value2 valueForKey: @"English"] floatValue]; if(floatValue1 > floatValue2){ return NSOrderedDescending; }else if(floatValue1 < floatValue2){ return NSOrderedAscending; }else{ return NSOrderedSame; } }
あとは配列を出力するだけ。
NSDictionary* top = [sorted_students objectAtIndex: 0]; NSLog(@"一番英語の点数が良かったのは、%@です。", [top valueForKey:@"Name"]);