0

今、私はこのような辞書を持っています。これは単なる例です。AからZまで取得しました:

(
        {
        id = 13;
        name = "Roll";
        firstLetter = R;
    },
        {
        id = 14;
        name = "Scroll";
        firstLetter = S;
    },
        {
        id = 16;
        name = "Rock";
        firstLetter = R;
    },
        {
        id = 17;
        name = "Start";
        firstLetter = S;
    }
)

同じ firstLetter を持つ dict を抽出し、これらを NSArray オブジェクトに結合したいと考えています。期待される結果は次のようになります。

R配列:

(
        {
        id = 13;
        name = "Roll";
        firstLetter = R;
    },
        {
        id = 16;
        name = "Rock";
        firstLetter = R;
    }
)

および S 配列:

(

    {
        id = 14;
        name = "Scroll";
        firstLetter = S;
    },
        {
        id = 17;
        name = "Start";
        firstLetter = S;
    }
)

どうやってするか?

4

5 に答える 5

2

より良い方法は、Saohooouによって提案された方法だと思います

しかし、それは次のように最適化できます

NSArray *array = @[@{@"id": @13,@"name":@"Roll",@"firstLetter":@"R"},
                   @{@"id": @14,@"name":@"Scroll",@"firstLetter":@"S"},
                   @{@"id": @15,@"name":@"Rock",@"firstLetter":@"R"},
                   @{@"id": @16,@"name":@"Start",@"firstLetter":@"S"}];

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
[array enumerateObjectsUsingBlock:^(NSDictionary *dict, NSUInteger idx, BOOL *stop) {
    NSString *key = dict[@"firstLetter"];
    NSMutableArray *tempArray = dictionary[key];
    if (!tempArray) {
        tempArray = [NSMutableArray array];
    }
    [tempArray addObject:dict];
    dictionary[key] = tempArray;
}];
NSLog(@"%@",dictionary);
于 2013-06-21T05:10:31.593 に答える
0

これを試して

 NSString *currentStr;
 //this int is to detect currentStr
 NSInteger i;

 NSMutableArray* R_Array = [[NSMutableArray alloc] init];
 NSMutableArray* S_Array = [[NSMutableArray alloc] init];


 for (NSDictionary *myDict in MyDictArray){

    NSString *tempStr = [myDict objectForKey:@"firstLetter"];
    if(currentStr = nil && [currentStr isEqualToString:""]){
       currentStr = tempStr;

       if([currentStr isEqualToString:"R"] ){
          [R_Array addObject:myDict];
          i = 0;
       }else{
          [S_Array addObject:myDict];
          i = 1;
       }
    }else{
       if([currentStr isEqualToString:tempStr]){
          (i=0)?[R_Array addObject:myDict]:[S_Array addObject:myDict];
       }else{
          (i=0)?[R_Array addObject:myDict]:[S_Array addObject:myDict];
       }
    }

 }

あなたの辞書に基づいてください。2つのタイプしかないので、2つの配列を作成し、if-elseを使用して問題を解決しました。複数の値がある場合は、switch-case を試すことができます。

これをやろう

  NSMutaleDictionary * speDict = [[NSMutableDictionary alloc] init];
  for(i=0;i<26;i++){
     switch (i){
            case 0:
                [speDict setObject:[NSMutableArray alloc] init] forKey:@"A"];
                break;
            case 1:
                [speDict setObject:[NSMutableArray alloc] init] forKey:@"B"];
                break;
            Case 2:
                [speDict setObject:[NSMutableArray alloc] init] forKey:@"C"];
                break;
            ...........
            Case 25:
                [speDict setObject:[NSMutableArray alloc] init] forKey:@"Z"];
                break;
        }
  }

  for (NSDictionary *myDict in MyDictArray){

     NSString *tempStr = [myDict objectForKey:@"firstLetter"];

     switch (tempStr)
            case A:
                [self addToMySpeDictArrayWithObject:myDict andStr:temStr];
                break;
            case B:
                [self addToMySpeDictArrayWithObject:myDict andStr:temStr];
                break;
            Case C:
                [self addToMySpeDictArrayWithObject:myDict andStr:temStr];
                break;
            ...........
            Case Z:
                [self addToMySpeDictArrayWithObject:myDict andStr:temStr];
                break;
  }

  -(void)addToMySpeDictArrayWithObject:(NSDictionary*)_dict andStr:(NString*)_str
  {
       NSMutableArray *tempArray = [speDict objectForKey:_str];
       [tempArray addObject:_dict];

  }

次に、仕様は次のようになります

 A:
 //all firstletter is A
 myDict
 myDict
 myDict
 B:
 //all firstletter is B
 myDict
 myDict
 .......
于 2013-06-21T02:06:07.063 に答える
0

辞書を NSArray として編成したと仮定します。

NSMutableDictionary* result = [NSMutableDictionary dictionary]; // NSDictionary of NSArray
for (id entry in dict) {
    NSString* firstLetter = [entry firstLetter];

    // Find the group of firstLetter 
    NSMutableArray* group = result[firstLetter];
    if (group == nil) {
        // No such group --> create new a new one and add it to the result
        group = [NSMutableArray array];
        result[firstLetter] = group;
    }

    // Either group has existed, or has been just created
    // Add the entry to it
    [group addObject: entry];
}

resultあなたが望むものを保持します。

于 2013-06-21T02:18:49.507 に答える
0
                    NSMutableDictionay *dic = [NSMutableDictionay dictionay];
                    for ( YourObject *obj in yourDic.allValues )
                    {

                        NSMutableArray *dateArray = dic[obj.firstLetter];
                        if ( !dateArray )
                        {
                            dateArray = [NSMutableArray array];

                            [dic setObject:dateArray forKey:obj.firstLetter];
                        }

                        [dateArray addObject:obj];
                    }

だからdicはあなたが望むものです

于 2013-06-21T01:59:42.847 に答える