programing

사전을 보면서 반복할 수 있는 방법이 있나요?

newnotes 2023. 4. 10. 22:13
반응형

사전을 보면서 반복할 수 있는 방법이 있나요?

알고있어요NSDictionaries필요한 부분으로서key을 얻기 위해value하지만 어떻게 반복할 수 있을까?keys그리고.values에 있어서NSDictionary어떤 키가 있고 어떤 값이 있는지 알 수 있습니다.'포인루프'라는 게 있다는 걸 알아요JavaScript에 비슷한 게 있나요?Objective-C?

네.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]);

블록 접근법에서는 모든 키에 대해 룩업알고리즘을 실행하는 것을 회피합니다.

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

해시 테이블로 구현되어 있어도(즉, 요소 검색 비용은) 룩업은 반복 속도를 일정하게 늦춥니다.

제가 측정한 바로는 사전의 경우입니다.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% 빨라졌습니다.

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

    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.
    }];

자동 완성은 설정 속도가 매우 빠르며 반복 엔벨로프 작성에 대해 걱정할 필요가 없습니다.

언급URL : https://stackoverflow.com/questions/1284429/is-there-a-way-to-iterate-over-a-dictionary

반응형