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