문제

nsarray에는 지정된 인덱스에 대한 개체를 찾는 데 유용한 방법이 있습니다.

// To find objects by indexes
- (id)objectAtIndex:(NSUInteger)index
- (NSArray *)objectsAtIndexes:(NSIndexSet *)indexes

// To find index by object
- (NSUInteger)indexOfObject:(id)anObject

그러나 나는 얻고 싶다 NSIndexSet 주어진 객체의 경우 (다중 인덱스). 같은 것 :

- (NSIndexSet *)indexesOfObjects:(NSArray *)objects

이 방법은 존재하지 않습니다 NSArray. 내가 뭔가를 놓치고 있습니까? 누군가 다른 표준 방법을 알고 있습니까? 그렇지 않으면 이것을 범주 방법으로 작성해야합니다.

도움이 되었습니까?

해결책

다음과 같이 찾을 객체를 지정하기 위해 세트를 사용하여 구현하는 것이 유용 할 수 있습니다.

- (NSIndexSet *) indicesOfObjectsInSet: (NSSet *) set
{
    if ( [set count] == 0 )
        return ( [NSIndexSet indexSet] );

    NSMutableIndexSet * indices = [NSMutableIndexSet indexSet];

    NSUInteger index = 0;
    for ( id obj in self )
    {
        if ( [set containsObject: obj] )
            [indices addIndex: index];

        index++;
    }

    return ( [[indices copy] autorelease] );
}

이것은 배열의 모든 객체를 방문해야하지만 적어도 한 번만 그렇게하고 그렇게하는 동안 빠른 열거를 사용합니다. NSSET을 사용하고 해당 세트에 대한 배열에서 각 객체를 테스트하는 것도 배열에 포함을 테스트하는 것보다 훨씬 빠릅니다.

여기에는 잠재적 인 최적화가 있지만, 단일 객체가 수신 어레이에 여러 번 저장되는 경우에도 깨질 것입니다.

if ( [set containsObject: obj] )
{
    [indices addIndex: index];
    if ( [indices count] == [set count] )
        break;
}

이렇게하면 두 개의 객체에 대해 20'000 항목 배열을 스캔하고 처음 10 개 안에있는 경우 배열에서 다른 19'990 객체를 스캔하지 않아도됩니다. 내가 말했듯이, 배열에 복제가 포함되어 있으면 도움이되지 않습니다. 두 개의 지수가 발견 되 자마자 중지되므로 (둘 다 동일한 객체를 가리더라도).

라고 한, 나는 위의 Mike의 의견에 동의합니다. 최적화 시간에 약간의 고통을 겪을 가능성이 있습니다. 다른 데이터 유형에 대해 생각할 가치가 있습니다. 예를 들어, NSARRAY는 간단한 플랫 컨테이너의 가장 논리적 인 선택으로 보이지만 실제로 주문 정보가 필요하지 않으면 NSSET을 대신 사용하는 것이 좋습니다. 이것은 동일한 객체를 저장하지 않을 것이라는 추가 이점이 있습니다 ( -isEqual:) 두 배. 복제물을 추적하려고하지만 주문이 필요하지 않은 경우 NSCountedSet을 사용할 수 있습니다. NSCOUNTEDSET을 사용할 수 있습니다. NSSET으로 작동하는 경우 실제로 복제물을 저장하지 않고 각 객체가 추가/제거 된 횟수를 추적합니다.

다른 팁

최신 NSARRAY 버전 (OSX 10.6 및 iOS 4)은 indexesOfObjectsPassingTest: 방법.

NSIndexSet *indexesOfObjects = [[array1 indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    return [array2 containsObject:obj];
}];

내가 볼 수있는 한 자신의 범주를 구현해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top