2009-09-25 7 views
27

두 개의 NSArrays가 있는데, 문자열을 포함하는 두 개의 배열을 비교하고 유사점을 찾아 첫 번째 배열을 다시 작성하지만 유사성이 없습니다.두 개의 배열 비교

예를 들면 다음과 같습니다.

두 배열 :

NSArray *arrayOne = [NSArray arrayWithObjects:@"TD1", @"TD2", @"TD3", nil]; 
NSArray *arrayTwo = [NSArray arrayWithObjects:@"Blah", @"String", @"TD2", nil]; 

결과 :

NSArray *arrayOne = [NSArray arrayWithObjects:@"TD1", @"TD2", @"TD3", nil]; 

NSArray *arrayOneCopy = [NSArray arrayWithObjects:@"TD1", @"TD3", nil]; 
NSArray *arrayTwo = [NSArray arrayWithObjects:@"Blah", @"String", @"TD2", nil]; 

답변

56
NSMutableArray *arrayOneCopy = [NSMutableArray arrayWithArray:arrayOne]; 
[arrayOneCopy removeObjectsInArray:arrayTwo]; 
28

사용 NSMutableSet :

NSMutableSet *setOne = [NSMutableSet setWithArray: arrayOne]; 
NSMutableSet *setTwo = [NSMutableSet setWithArray: arrayTwo]; 

[setOne minusSet: setTwo]; 

NSArray *arrayOneResult = [setOne allObjects]; 

(엄밀히 말하면, setTwo는 가변 할 수 없습니다일 수도 있습니다.(더 나은 성능))

NSArray를 다른 사람이 대답 한대로 사용하십시오.

데이터 세트 크기에 따라 전적으로 달라집니다. 작은 데이터 세트의 경우 어레이 솔루션이 정상적으로 작동합니다. 더 큰 세트의 경우 NSSet은 멤버쉽 테스트가 선형 검색이 아니라 해시 검사라는 점에서 훨씬 효율적입니다.

가장 잘 작동하는 것을 측정하여 사용하십시오.

+0

사이에 다른 개체의 수를 반환 NSArray와 다른 솔루션, 맞죠? –

+0

좋은 답변이지만, 당신이 말했듯이 다른 솔루션을 사용할 예정이므로 작은 데이터 세트 만 사용하고 있습니다. 어쨌든 고마워! – Joshua

+0

예 - 작은 데이터 세트의 경우 "newacct"의 대답이 필요합니다. – bbum

3
- (NSInteger)countOfDifferentObjects:(NSArray *)anotherArray { 

    NSSet * s = [NSSet setWithArray:self]; 
    NSMutableSet * s1 = [NSMutableSet setWithSet:s]; 
    NSSet * s2 = [NSSet setWithArray:anotherArray]; 

    [s1 unionSet:s2]; 
    [s1 minusSet:s]; 
    return [s1 count]; 
} 

이 두 배열 (비교 ISEQUAL 함께) 배열의 항목의 순서가 중요하다면, 나는이 하나가를 사용하는 것 같아요

array1 = @"A", @"B", @"C" 
array2 = @"B", @"D", @"Z" 
returns 2 (D and Z are different)