2012-01-26 2 views
4

원래 질문을 편집했을 때 잘못된 질문을 한 것 같습니다.알 수없는 NSMutableArray 깊이의 값 검색

배열 내에 배열을 저장할뿐만 아니라 NSDictionaries도 저장합니다. 유틸리티 유형의 응용 프로그램이며 설정된 구조가 없으므로 사용자는 필요한만큼 중첩 된 정보를 입력 할 수 있습니다.

이상적으로는 set 매개 변수 (클래스 유형, 사전 키일 수도 있음)가있는 배열의 전체 내용을 스크롤하는 방법이 필요합니다. 여기 .. ​​예입니다

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

검색 매개 변수로 사전에있는 객체를 사용하도록 수정 될 수 있습니까? 예 : [self 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

재귀 적 접근 방식은 요구 사항에 맞을 것입니다. 또한 사전에 원하는 키가 포함되어 있는지 확인해야합니다 (여러 가지 유형의 사전이 사전으로 표시 될 수 있으므로 ...). NSDictionary 범주를 만들어 사전 클래스 유형 내에서 일치하는지 확인할 수 있습니다.

는 말은 :

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

나는 더 "고급"가 될 수 알고 있지만이 유용 할 수 있습니다.

관련 문제