2011-01-01 5 views
3

나는 아래와 같은 사전을 만들었습니다. 실제 키 값 (배우 이름)을 objectAtIndex:1에서 어떻게 가져올 수 있습니까?사전 개체에서 키 가져 오기?

<plist version="1.0"> 
<dict> 
    <key>Brad Pitt</key> 
    <array> 
     <string>Fight Club</string> 
     <string>Seven</string> 
     <string>Inglorious Basterds</string> 
     <string>Babel</string> 
    </array> 
    <key>Meryl Streep</key> 
    <array> 
     <string>Adaptation</string> 
     <string>The Devil Wears Prada</string> 
     <string>Doubt</string> 
     <string>Julie &amp; Julia</string> 
    </array> 
    <key>Chris Cooper</key> 
    <array> 
     <string>Adaptation</string> 
     <string>American Beauty</string> 
     <string>The Bourne Identity</string> 
     <string>October Sky</string> 
    </array> 
</dict> 
</plist> 

답변

1

난 당신이 이런 식으로 뭔가를 찾고 생각 : 당신은이 같은 구조를 사용하여 예를 들어, 당신이있는 NSArray에 저장할 필요가 정렬 된 목록에서 배우/영화 쌍을 저장하려면?

NSString *actorName = [[actorsDictionary allKeys] objectAtIndex:index]; 
+0

아름다운. 그게 바로 제가 찾던 것입니다. 감사합니다! – thenameisnick

+6

이것은 현혹 적으로 잘못되었습니다. 'allKeys'는 사전 자체가 순서가 없기 때문에 ** 정의되지 않은 ** 순서로 항목을 반환합니다. 내부 구현 세부 사항은 외관상 일관된 순서를 반환 할 수 있지만 * 과거에는 변경 될 수 있습니다. 이 행동에 의존하는 것은 잘못된 것입니다. –

+0

Dave는 절대적으로 적합합니다. 이 대답은 정확하지 않습니다. –

5

브 루트 포스가 :

NSArray * allKeys = [dictionary allKeys]; 
NSString * randomKey = [allKeys objectAtIndex:(arc4random() % [allKeys count])]; 
+0

나는 영화 나 배우의 이름을 미리 알지 못합니다. 내가 가질 수있는 것은 임의의 객체 색인 번호뿐입니다. – thenameisnick

+0

그러면 NSDictionary는 정의에 따라 순서가 지정되지 않으므로 잘못된 데이터 구조입니다. 순서가 지정된지도가 필요합니다. AFAIK, Foundation 및 AppKit에는 하나도 포함되어 있지 않으므로 ... – ipmcc

+0

더 나은 방법은 단순히 무작위 키를 반환하는 것입니까? – thenameisnick

1

사전 주문한되지 않으므로이있다 : 당신이 사전에서 임의의 키를 반환하려면

- (NSString *)actorForFilm:(NSString *)film { 
    NSDictionary * dictionary = ...; //your dictionary as read from the plist 
    for (NSString * actorName in dictionary) { 
     NSArray * films = [dictionary objectForKey:actorName]; 
     if ([films containsObject:film]) { 
      return actorName; 
     } 
    } 
    return nil; 
} 

, 당신은 할 수 NSDictionary 클래스의 objectAtIndex: 메소드가 없습니다.

# pseudo-code: [] = array, {} = dictionary 
[ 
    { actor: "Brad Pitt", movies: ["Fight Club", "Seven", "Babel"] }, 
    { actor: "Meryl Streep", movies: ["Adaptation", "Doubt"] }, 
    # etc... 
] 
+0

오 사전은 순서가 매겨지지 않았다는 것을 몰랐다. 그러나, 다른 이유로, 나는 그런 식으로 데이터를 구조화하는 것을 피합니다. 사전에 키 값을 배열에로드 한 다음 인덱스 값을 기반으로 액터의 이름을 가져올 수 있습니까? – thenameisnick

+0

색인 키를 사용하면됩니다. 하지만 여전히 잘못된 데이터 구조를 사용하게 될 것입니다. 당신이 일하는 것에 따라 당신은 그 기술 부서를 피해야 할 수도 있습니다. 잘못된 데이터 구조를 사용하면 코드 기반을 저하시키는 "빠른 수정"을 쉽게 구현할 수 있습니다. –