2

NSDictionariesのNSArrayがあります。NSArrayのNSDictionaryのキーのオブジェクトが少なくとも1つ存在するかどうかを確認する必要があります。私はこれを使用して行います

int i;
for (i=0;i< [myArray count];i++)
{
    if ([[[myArray objectAtIndex: i] objectForKey: myKey] isEqualToString: myString]) {
        found = YES;
        break;
    } else {
        found = NO;
    }
}

しかし、私はそれのためのより良い/より速い代替案があるのではないかと疑っています...

ありがとう

4

7 に答える 7

7

はい。for-in一般にループとも呼ばれる「高速列挙」を使用します。

for (NSDictionary* dict in myArray) {

また、を比較するにはNSString、を使用します-isEqualToString:

   if ([[dict objectForKey: myKey] isEqualToString:myString]) {

とはいえ、これに対するアルゴリズムの改善はありません(つまり、この方法はすでに最良です)。

于 2010-02-15T21:18:19.613 に答える
6

これは、現在のデータ構造で取得できるのと同じくらい高速です。配列内の各ディクショナリに対してO(1)ルックアップを実行しています。膨大な数のディクショナリがある場合、これはコストがかかる可能性があるため、ディクショナリ内のすべての値を含む文字列オブジェクトのセットを含む別のルックアサイドNSSetを保持することを検討できます(データのセマンティクスに大きく依存します)。次に、そのセットで存在を確認できます。

より多くの洞察を得るために、データの形式について詳しく教えてください...

==また、sを使用する演算子にも注意してNSStringください。文字列のテキストが等しいかどうかを実際に確認している場合は-isEqualToString:、フォームが参照比較を行うだけなので、代わりに使用する必要があります。

于 2010-02-15T21:17:09.893 に答える
5

高速列挙を使用する必要があります。これにより、舞台裏でC配列を使用してオブジェクトを反復処理します。現在、ループを通過するたびに-objectAtIndex:と-countの両方を呼び出しています。

myKeyが文字列の場合は、NSPredicateを確認することもできます。私の腸はそれが遅くなるだろうと私に言います、しかしあなたはそれがNSDictionaryのための内部最適化から利益を得るかもしれないかどうか決してわかりません:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ LIKE %@", myKey, myString];
BOOL found = ([[myArray filteredArrayUsingPredicate:predicate] count] > 0);
于 2010-02-16T22:05:12.757 に答える
3

Key-Valueコーディングを使用すると、はるかに簡潔になる可能性があります。

[[myArray valueForKey:myKey] containsObject:myString];

必ずしも速いとは限りませんが(遅くなると思います)、速度が常に主要な関心事であるとは限りません。特定の場合に速度が重要であるかどうかは、プロファイリングが決定する問題です。

于 2010-02-16T22:31:55.137 に答える
2

文字列の同等性をチェックするために使用==すると、実際にポインタを比較しているため、予期しない動作が発生する可能性があります(2つのポインタが指す単一の文字列オブジェクトを処理していることが確実な場合は問題ありません)。isEqualToString:おそらくあなたが代わりに欲しいものです。

「高速列挙」を使用して、物事を少し単純化できます。

bool found = NO;

for (NSDictionary *dict in myArray) {
    found = [[dict objectForKey:myKey] isEqualToString:myString];

    if (found)
        break;
}

書く単語が少ないという意味で「速い」だけです。実行速度は同じです。

于 2010-02-15T21:17:00.330 に答える
1

オブジェクトを受け取った後、受け取ったオブジェクトが「NSArray」、「NSDictionary」、「NSString」などであることを確認できます。次のコードを使用して、オブジェクトを確認できます。

if([obj isKindOfClass:[NSArray class]]){
    NSLog(@"IS NSArray");
}
else if([obj isKindOfClass:[NSDictionary class]]){
    NSLog(@"Is NSDictionary");
}
else
{
    NSLog(@"Other");
}
于 2014-10-02T22:30:53.337 に答える
0

高速列挙で

BOOL found;

for (NSDictionary *dict in array) {

        if ([[dict objectForKey:@"YOURKEY"] isEqualToString:@"YOURVALUE"]) {
            found = YES;
            break;
        } else {
            found = NO;
        }
    }
于 2016-09-28T09:14:43.507 に答える