2011-04-28 3 views
2

개체가 배열에 있는지 여부를 알고 싶습니다.개체가 이미 NSMutableArray에 있는지를 확인하는 가장 효율적인 방법은 무엇입니까?

- (BOOL)containsObject:(id)anObj 

을하지만 배열의 모든 객체에 -isEqual 보낼 것이다 :

그래서 사용할 수 있습니다. 그들 중 수천 명이있을 때 나쁜.

그리고는이 :

- (NSUInteger)indexOfObjectIdenticalTo:(id)anObject 

에만 메모리 주소를 비교 보인다. 나는 이것이 더 빠르다고 생각한다. 물론 사용하기에는 약간 지저분합니다. 하나는 NSNotFound를 확인해야합니다.

정말 -indexOfObjectIdenticalTo가 가장 좋습니다. 여기

는 SO 게시 한 번 더 귀하가 설명하고 비교 indexOfObjectIdenticalTo 나에게 사용하는 첫 번째 선택을 보인다 당으로

답변

2

, 당신은 범주별로 인스턴스 메서드를 만들 수 있습니다.

간단한 함수로도 충분합니다.

+1

+1은 mon_ : =) –

+0

인터페이스의 단순화. 그러나, 나는 그것 mon_containsObjectIdenticalTo : indexOfObject : indexOfObjectIdenticalTo : 쌍 미러 수 있습니다. – JeremyP

1

가능하면 (정렬 순서 인 경우, 예를 들어 부적절한) 당신은 [NSNull null]의 키와 값으로 객체를 가지고 대신 NSDictionary를 사용할 수 있습니다. 키로 사용할 때 객체가 복사됩니다. 개체에 - (NSUInteger)hash 메서드를 구현해야합니다.

Matt Gallagher의 우수 NSArray or NSSet, NSDictionary or NSMapTable 분석도 참조하십시오.

2

그러나 불쾌한 약간

왜 사용 하는가?

if ([array indexOfObjectIdenticalTo: foo] != NSNotFound) 
{ 
    // do what you need 
} 

훨씬 더 불쾌한 당신은 당신이 무엇을 사용 평등 의미에 따라 하나를 선택

if ([array containsObject: foo]) 
{ 
    // do what you need 
} 

보다 것을 나에게 보인다. 배열 NSString 또는 NSNumber을 포함하는 배열의 경우 -containsObject:을 사용하려는 것이 좋습니다. 왜냐하면 -isEqual:이 올바른 항등 의미를 제공하기 때문입니다.

두 가지 방법은 모두 실제 성능 문제가있는 O (n)입니다. 선형 검색의 아이디어가 문제라면 다른 데이터 구조를 고려하십시오. NSDictionary를 기반으로합니다.

@interface NSArray (MONStuff) 
- (BOOL)mon_containsObject:(id)object; 
@end 


@implementation NSArray (MONStuff) 

- (BOOL)mon_containsObject:(id)object { 
    return NSNotFound != [self indexOfObjectIdenticalTo:arg]; 
} 

@end 

또는 이들도 CFArrayContainsValue : 당신은 정말 자주 필요한 경우

+0

두 번째 것은 훨씬 짧고 지침이 적습니다. 그래서 네, NSNotFound를 비교하는 것은 다소 불쾌합니다 : =) –

+0

O (n)에 +1. 그렇습니다.사전의 강력한 해시 기능을 사용하는 것이 좋습니다. 감사. –

관련 문제