2012-01-26 3 views
4

私は元来の質問を編集したので間違った質問をしました。未知のNSMutableArrayの深さの値を検索する

私は配列の中にNSDictionariesと同様に配列を格納しています。これは実用的なアプリケーションであり、設定された構造がないため、ユーザーは入れ子になった情報を必要なだけ入力することができます。

理想的には、セットパラメータ(クラスの一種、多分辞書キー)を指定して、配列の内容全体をスクロールするメソッドが必要です。ここでは...例です

NSMutableArray *array = [[NSMutableArray alloc]init]; 

NSMutableDictionary *enteredItem = [[NSMutableDictionary alloc]init]; 

[enteredItem setObject:@"i'm a title"  forKey:@"title"]; 
[enteredItem setObject:@"i'm an id"   forKey:@"id"]; 
[enteredItem setObject:@"i'm a description" forKey:@"description"]; 
[enteredItem setObject:@"i'm a timestamp" forKey:@"timestamp"]; 
[enteredItem setObject:array    forKey:@"items"]; 


[array addObject:enteredItem]; 
[array addObject:anotherDictionary]; 
[array addObject:moreDictionaries]; 

したがって、上記の例では、私は「私はIDだ」@が含まれている辞書を見つける(そしてそれを返す)する必要があります。

私の質問は明らかです。あなたが提供できるお手伝いをありがとう。

答えて

4

再帰的なアプローチは正しいですが、再帰がわからない場合は、コードサンプルが非常に役立つかどうかはわかりません。ここで作業溶液だ:

は、これらのメソッドの追加:次に、あなたのオブジェクトを見つけることが

- (id)findObjectWithKey:(id)key inArray:(NSArray *)array 
{ 
    for (id object in array) 
    { 
     if ([object isKindOfClass:[NSArray class]]) 
     { 
      return [self findObjectWithKey:key inArray:object]; 
     } 
     else if ([object isKindOfClass:[NSDictionary class]]) 
     { 
      return [self findObjectWithKey:key inDictionary:object]; 
     } 
    } 
    return nil; 
} 

- (id)findObjectWithKey:(id)key inDictionary:(NSDictionary *)dict 
{ 
    for (id subKey in dict) 
    { 
     id object = [dict objectForKey:subKey]; 
     if ([subKey isEqual:key]) 
     { 
      return object; 
     } 
     else if ([object isKindOfClass:[NSArray class]]) 
     { 
      return [self findObjectWithKey:key inArray:object]; 
     } 
     else if ([object isKindOfClass:[NSDictionary class]]) 
     { 
      return [self findObjectWithKey:key inDictionary:object]; 
     } 
    } 
    return nil; 
} 

を、ちょうど言う:

id object = [self findObjectForKey:@"title" inArray:array]; 

特定のオブジェクトを検索し、辞書のキーを返すようにする方法を変更するには代わりに、次の操作を行います。

- (id)findKeyWithObject:(id)key inArray:(NSArray *)array 
{ 
    for (id object in array) 
    { 
     if ([object isKindOfClass:[NSArray class]]) 
     { 
      return [self findKeyWithObject:key inArray:object]; 
     } 
     else if ([object isKindOfClass:[NSDictionary class]]) 
     { 
      return [self findKeyWithObject:key inDictionary:object]; 
     } 
    } 
    return nil; 
} 

- (id)findKeyWithObject:(id)object inDictionary:(NSDictionary *)dict 
{ 
    for (id key in dict) 
    { 
     id subObject = [dict objectForKey:key]; 
     if ([subObject isEqual:object]) 
     { 
      return key; 
     } 
     else if ([subObject isKindOfClass:[NSArray class]]) 
     { 
      return [self findKeyWithObject:object inArray:object]; 
     } 
     else if ([subObject isKindOfClass:[NSDictionary class]]) 
     { 
      return [self findKeyWithObject:object inDictionary:object]; 
     } 
    } 
    return nil; 
} 

は、その後、あなたの鍵を見つけるために、ちょうど言う:

id key = [self findKeyWithObject:object inArray:array]; 
+0

詳細な説明をありがとうございます!私はそれがどうなるかを知っているでしょう:) – user1168056

+0

辞書のオブジェクトを検索パラメータとして使用するようにこれを修正できますか?例: [自己findKeyForObject @ "私はユーザIDです"]; 乾杯: – user1168056

+0

はい、可能です。キーの代わりにオブジェクトを比較し、オブジェクトが等しい場合はキーを返します。他のすべては同じでなければなりません。配列内のオブジェクトが見つかった場合でも、キーを返すことはできませんでした(配列にはキーがありません)。 –

1

再帰検索はどうですか?

- (void) searchRecursive :(NSArray *) array { 
    NSEnumerator *e = [array objectEnumerator]; 
    id obj; 
    while ((obj = [e nextObject])) { 
     if ([e isKindOfClass [NSArray class]]) 
      [self searchRecursive :obj] 
     else 
      objobject ... forKey ... 
1

ottが述べているように、再帰的アプローチは要件に合っています。また、辞書には必要なキーが含まれているかどうかをチェックする必要があります(辞書で表されるオブジェクトの種類が異なると思われるので...)。たぶん、NSDictionaryカテゴリを作成して、辞書クラスの型内で一致するかどうかを調べることができます。

私は意味:

- (void)isType1 
{ 
return (([self objectForKey:@"title"] != nil) && [self objectForKey:@"id"] != nil) && ...); 
} 

私はそれがより「洗練された」かもしれないが、これは有用である可能性が知っています。

関連する問題