【Objective-C】独自クラスの配列でfilteredArrayUsingPredicate
下記のようなモデルクラスがあります。
@interface HogeModel : NSObject @property NSString *groupCode; @property NSString *code; @property NSString *value; @end @implementation HogeModel : NSObject @end
上記のモデルの配列からgroupCodeが同じものだけ集めた配列を作り、
key=「groupCode」, value=「groupCodeに紐づくHogeModelオブジェクトの配列」なDictionaryにする(日本語が下手ですね。。。)
そんなことをすることがあったので、そのコードをまとめておく。
// groupCode="01"は都道府県で HogeModel *model1 = [[HogeModel alloc] init]; model1.groupCode = @"01"; model1.code = @"01"; model1.value = @"東京"; HogeModel *model2 = [[HogeModel alloc] init]; model2.groupCode = @"01"; model2.code = @"02"; model2.value = @"愛知"; HogeModel *model3 = [[HogeModel alloc] init]; model3.groupCode = @"01"; model3.code = @"03"; model3.value = @"大阪"; // groupCode="02"は市区町村みたいな HogeModel *model4 = [[HogeModel alloc] init]; model4.groupCode = @"02"; model4.code = @"01"; model4.value = @"板橋区"; HogeModel *model5 = [[HogeModel alloc] init]; model5.groupCode = @"02"; model5.code = @"02"; model5.value = @"中央区"; NSArray *hogeModelArray = @[ model1, model2, model3, model4, model5 ]; // groupCodeでSetを作成 NSMutableSet *keySet = [NSMutableSet set]; for (HogeModel *model in hogeModelArray) { // nilチェック if(!model.groupCode) { continue; } [keySet addObject:model.groupCode]; } // filteredArrayUsingPredicateを利用し、groupCodeが同じものだけ集めた配列を作成。 // 作成された配列をgroupCodeをキーにしたDictionaryとして保持する NSMutableDictionary *resultDictionary = [NSMutableDictionary dictionary]; for (NSString *key in keySet) { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"groupCode like %@", key]; NSArray *sameSameGroupArray = [hogeModelArray filteredArrayUsingPredicate:predicate]; [resultDictionary setValue: sameSameGroupArray forKey:key]; } // 結果をログ出力 for (NSString *key in resultDictionary) { NSLog(@"key: %@", key); for (HogeModel *model in resultDictionary[key]) { NSLog(@"HogeModel.value: %@", model.value); } }
出力結果
key: 01 HogeModel.value: 東京 HogeModel.value: 愛知 HogeModel.value: 大阪 key: 02 HogeModel.value: 板橋区 HogeModel.value: 中央区