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


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.