3

少し奇妙な問題があります。だから私は辞書の配列を持っています、

(
Dict 1:
"Name" = "B"
"Number" = "2"

Dict 2:
"Name" = "A"
"Number" = "1"

Dict 3:
"Name" = "D"
"Number" = "4"

Dict 4:
"Name" = "C"
"Number" = "3"

Dict 5
"Name" = "E"
"Number" = "5"
)

そして、配列があるとします:

(
"1"
"4"
"2"
)

「番号」キーがその配列内の各オブジェクトと一致するすべての辞書を含む配列を取得し、2 番目の配列に従って並べ替えるにはどうすればよいですか?

たとえば、出力は次のようになります

(
Dict 1:
"Name" = "A"
"Number" = "1"

Dict 2:
"Name" = "D"
"Number" = "4"

Dict 3:
"Name" = "B"
"Number" = "2"
)

使用できると思いますsortedArrayUsingDescriptorsが、複数の記述子を指定する方法がわかりません。記述子に配列内のすべてのオブジェクトを含めることができますか? どんな助けや指導も大歓迎です。

4

4 に答える 4

3

これは並べ替えとは関係ありません。特に、配列内のすべての辞書が関係しているわけではないためです。やりたいことは、配列から各辞書を抽出することです。

辞書の配列がまったくない場合、これははるかに簡単になります。代わりに、キーが数値で、値が何でもよい 1 つの大きな辞書 (おそらく辞書全体、おそらく名前だけ) から始める必要があります。これで、各番号をその辞書のキーとして検索し、名前を取得できます。

{ 1 => A, 2 => B, 3 => C ...}

objectForKey:@1objectForKey:@4、をつかむだけでobjectForKey:@2完了です。

于 2014-03-21T04:42:13.503 に答える
0

だから私はそれを理解しました。基本的に、ネストされた for ループを使用しました。

これがコードです。それぞれのオブジェクトの数によっては、時間がかかる場合があります。私にとっては、それぞれ約 30 個のオブジェクトがあったため、約 50 ミリ秒かかりました。

NSMutableArray *finalArray = [NSMutableArray array];
for (NSString *keyName in keyArray) {
    NSString *fname;
    for (NSDictionary *dict in dictArray) {
        fname = [dict objectForKey:@"theKey"];
        if ([fname isEqualToString:keyName])
            [finalArray addObject:dict];
    }
}
于 2014-03-21T05:35:22.337 に答える
0

これが答えです。ここでは、より高速な列挙子を使用しました

NSArray * dicArray = @[@{@"Name": @"B",@"Number":@"2"},
                       @{@"Name": @"A",@"Number":@"1"},
                       @{@"Name": @"D",@"Number":@"4"},
                       @{@"Name": @"C",@"Number":@"3"},
                       @{@"Name": @"E",@"Number":@"5"}];
NSArray * indArray = @[@(1),@(4),@(2)];

NSMutableArray * resultArray = [NSMutableArray arrayWithCapacity:indArray.count];
[indArray enumerateObjectsUsingBlock:^(NSNumber* SearchValue, NSUInteger idx, BOOL *stop) {

    //search dicArray for object, which match your condition (i.e Number value == obj value)
    NSInteger index = [dicArray indexOfObjectPassingTest:^BOOL(NSDictionary* obj, NSUInteger idx, BOOL *stop) {
        return ([(NSString *)obj[@"Number"] integerValue] == SearchValue.integerValue)? YES : NO;
    }];

    resultArray[idx] = dicArray[index];
}];

NSLog(@"%@",resultArray);
于 2014-03-21T05:16:29.473 に答える