忘備録

日々の調べ物をまとめる。アウトプットする。基本自分用。

【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: 中央区