2011-05-02 7 views
0

요소가 저장된 방식으로 사전에 액세스하려고합니다. 아무도 내가이 일을하도록 도울 수는 없었다. 미리 감사드립니다 !!사전에 순차적으로 액세스하는 방법은 무엇입니까?

+1

일반적인 사전 클래스는 추가 시간과 공간이 필요하고 사전의 표준 유스 케이스가 아니기 때문에 삽입 순서를 기억하지 않는다고 생각합니다. 이 정보를 저장하는 사전 클래스를 작성하는 것이 좋습니다. – Christian

+0

SDK 메서드를 사용하여 수행 할 수 없습니다. – lostInTransit

+0

가능한 [Objective-C 사전은 순서가 지정된 컨테이너입니까?] (http://stackoverflow.com/questions/1648059/is-the-objective-c-dictionary-anordord-container) – outis

답변

3

사전은 키 값에 의해 인덱싱 된 구조에 키의 해시 값을 더 정확하게 저장합니다. 이것이 그들이 빠른 이유입니다. 그들은 값을 검색 할 필요가 없습니다. 단지 키의 has 값을 가져 와서 값에 대해 곧바로 이동합니다 (대부분의 경우, 검색해야하는 키 해쉬 값을 충돌하는 경우에만 해당).

따라서 값을 저장하는 순서는 예측할 수 없습니다. 주문이 필요한 경우 배열 또는 링크 된 목록이 필요합니다. 두 구조에는 값이 저장되는 정의 된 순서가 있습니다.

사전 형식 액세스 및 주문 보존이 필요하면 사전 지원 목록이있는 오픈 소스 라이브러리를 찾아 보거나 버전을 소유해야합니까? 사전 인터페이스를 가져 와서 구현하도록 구현하십시오 목록과 내부 사전에 동시에 저장됩니다.

접근 자 메서드는 사전으로 이동하지만 목록을 검색하고 추가 순서로 데이터를 반환하는 반복자를 제공 할 수 있습니다.

1

코코아에서 주문 사전이 없습니다. 가장 좋은 방법은 사전을 래핑하고 입력 된 키의 배열을 유지하는 사용자 지정 클래스를 만드는 것입니다. 이것은 너무 어렵지 않습니다. 잘 NSMutableDictionary의 방법을 "포함"할 수 클래스,이 같은 일이 :

당신이 당신의 손이 더러워지고로 경우
// innerDict is an NSMutableDictionary 
// keyArray is an NSMutableArray 
- (void)setObject:(id <NSCopying>)anObject forKey:(id)aKey { 
    [innerDict setObject:anObject forKey:aKey]; 
    // Keys are added to the array in the order they go into the dictionary; 
    // users of the class can access the array to get this info 
    [keyArray addObject:aKey]; 
} 

- (id)objectForKey:(id)aKey { 
    return [innerDict objectForKey:aKey]; 
} 

- (void)removeObjectForKey:(id)aKey { 
    [innerDict removeObjectForKey:aKey]; 

    [keyArray removeObject:aKey]; 
} 

- (NSEnumerator *)keyEnumerator { 
    // It's actually better for users of this class to 
    // use fast enumeration on the keyArray; this is just an example 
    return [keyArray objectEnumerator]; 
} 

, 매트 갤러거는 너무 예로서 사전 정렬 된 사용에 일어나는 tutorial on collection subclassing있다 .

관련 문제