사전을 반복하는 방법이 있습니까?


200

를 얻기 위해 NSDictionaries필요한 곳으로 알고 있습니다. 하지만 어떻게 모든 것을 내가 반복 할 수 와 A의는 , 나는 키가 알고 그래서, 어떤이있다 값? 나는라는 것이 있습니다 알고 에 대한-에서 루프 에가 . 비슷한 것이 있습니까?keyvaluekeysvaluesNSDictionaryJavaScriptObjective-C


이 게시물에 감사드립니다. Swift구문을 반복하는 경우이 게시물을 참조하십시오. stackoverflow.com/a/24111700/419348
AechoLiu

답변:


323

예, NSDictionary빠른 열거를 지원합니다. Objective-C 2.0을 사용하면 다음을 수행 할 수 있습니다.

// To print out all key-value pairs in the NSDictionary myDict
for(id key in myDict)
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);

대체 방법 (Mac OS X 10.5 이전 버전을 대상으로하고 있지만 10.5 및 iPhone에서 계속 사용할 수있는 경우)은 다음을 사용하는 것입니다 NSEnumerator.

NSEnumerator *enumerator = [myDict keyEnumerator];
id key;
// extra parens to suppress warning about using = instead of ==
while((key = [enumerator nextObject]))
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);

2
ObjC 최신 구문 : NSLog (@ "key = % @ value = % @", key, myDict [key]);
geowar

@Darthenius는 최근 최적화로 인해 적어도 특정 경우에 블록 기반보다 빠른 열거가 다시 빠릅니다. 그러나 해결하려는 문제로 동시 옵션을 사용할 수 있으면 블록 기반 접근 방식이 더 빠를 수 있습니다.
Zev Eisenberg

@ZevEisenberg 내 게시물의 끝을 참조하십시오.
Rok Strniša

죄송합니다. 위의 링크를 클릭하여 새 탭에서 열었으며 누가 해당 페이지를 작성했는지 또는 같은 페이지에 있는지 알지 못했습니다. 위의 설명을 여전히 편집 할 수 있다면 게으른 독자가 잘못된 생각을 갖지 않도록 할 수 있습니다.
Zev Eisenberg

153

블록 접근법모든 키에 대해 조회 알고리즘을 실행하지 않습니다 .

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
  NSLog(@"%@ => %@", key, value);
}];

해시 테이블 (요소를 찾는 데 드는 비용이 있음을 의미) NSDictionary로 구현 되더라도 조회는 여전히 상수 요소만큼 반복 속도를 느리게합니다 .O(1)

내 측정 결과 d는 숫자 사전 에 대해 ...

NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
  NSNumber* value = @(i);
  dict[value.stringValue] = value;
}

... 블록 접근법으로 숫자를 합산 ...

__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
  sum += value.intValue;
}];

루프 접근 방식보다는 ...

int sum = 0;
for (NSString* key in dict)
  sum += [dict[key] intValue];

... 약 40 % 빠릅니다 .

편집 : 새로운 SDK (6.1+)는 루프 반복을 최적화하는 것처럼 보이므로 루프 접근법은 이제 위의 간단한 경우에 대해 블록 접근법보다 약 20 % 빠릅니다 .


iOS 10/11에서는 어떤 것이 더 빠릅니까?
Supertecnoboff

우아한, 그것을 사랑하십시오!
YvesLeBorg

10

이것은 블록 접근법을 사용한 반복입니다.

    NSDictionary *dict = @{@"key1":@1, @"key2":@2, @"key3":@3};

    [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@->%@",key,obj);
        // Set stop to YES when you wanted to break the iteration.
    }];

자동 완성 기능을 사용하면 설정 속도가 매우 빠르므로 반복 봉투 작성에 대해 걱정할 필요가 없습니다.


고맙습니다 .. NSMutableDictionary프로세스에서 변경이 필요한 경우 좋은 솔루션
jose920405
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.