NSArrayから重複しないで取り出す

 プログラミング  Comments Off on NSArrayから重複しないで取り出す
Apr 082012
 

NSArrayから重複の無いように要素をNSDictionary型で取り出す方法のまとめ。これには数ステップ必要。まずNSArrayから重複を除いたNSArrayを作成する。このNSArrayに含まれるキーからindexを調べる。indexからNSDictionaryに到達する流れ。

前提として次のような配列があるとする。ここからcodeの重複が無いように配列を作成するには次のようにする。

NSDictionary *city1=[NSDictionary dictionaryWithObjectsAndKeys:@"Sapporo",@"name",@"1",@"index",@"1",@"code", nil];
NSDictionary *city2=[NSDictionary dictionaryWithObjectsAndKeys:@"Saitama",@"name",@"2",@"index",@"2",@"code", nil];
NSDictionary *city3=[NSDictionary dictionaryWithObjectsAndKeys:@"Tokyo",@"name",@"3",@"index",@"2",@"code", nil];
NSDictionary *city4=[NSDictionary dictionaryWithObjectsAndKeys:@"Nagoya",@"name",@"4",@"index",@"3",@"code", nil];
NSArray *arr = [NSArray arrayWithObjects:city1,city2,city3,city4, nil];

NSArrayから重複を除いたNSArrayを作成

重複を除いた配列を作る方法は2つ。keyPathを使うと配列の要素から合計を特殊なキー(@sum,@avg等)を指定して色々操作可能。@distinctUnionOfObjectsを使うと、その直後に指定したキー(.code)の重複が無いように取り出した値を配列にして返す。上の場合、「1,2,2,3」は重複が省かれ「1,2,3」の3つの要素が抽出されて配列として出力される。この配列にはNSDictionary型のデータ(city)は入らず、キーの文字列(code)の配列となる点に注意。さらにソートされないので注意が必要。

NSArray *codes = [arr valueForKeyPath:@"@distinctUnionOfObjects.code"];

NSArrayに含まれるキーからindexを調べる

最初のキーの参照するcodeの入るindexを探す。

NSString code = [codes objectAtIndex:0];
NSInteger index = [codes indexOfObject:code];

indexからNSDictionaryを取り出す

indexの数値が参照するNSDictionary(city)を取り出す。

NSDictionary *dic = [arr objectAtIndex:index];
 Posted by at 21:25