2009-09-25 77 views
27

Tôi có hai NSArrays, những gì tôi đang làm là so sánh hai mảng có chứa chuỗi, tìm điểm giống nhau và tạo mảng đầu tiên một lần nữa nhưng chúng không có điểm tương đồng.So sánh hai mảng

Chỉ cần ví dụ như.

Hai Mảng:

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

Kết quả:

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

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

Trả lời

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

Sử dụng NSMutableSet:

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

[setOne minusSet: setTwo]; 

NSArray *arrayOneResult = [setOne allObjects]; 

(nói đúng, setTwo không phải là có thể thay đổi, có thể cũng là NSSet (hoạt động tốt hơn))

Hoặc sử dụng NSArray khi người khác trả lời - cũng hoạt động.

Loại nào hoạt động phụ thuộc hoàn toàn vào kích thước tập dữ liệu của bạn. Đối với các bộ dữ liệu nhỏ, giải pháp mảng hoạt động tốt. Đối với các tập lớn hơn, NSSet sẽ hiệu quả hơn nhiều trong các thử nghiệm thành viên đó là kiểm tra băm và không phải là tìm kiếm tuyến tính.

Đo và sử dụng thiết bị hoạt động tốt nhất.

+0

Nếu thứ tự của các mục trong mảng rất quan trọng, sau đó tôi đoán người ta sẽ phải sử dụng giải pháp khác với NSArray, phải không? –

+0

Câu trả lời hay, nhưng như bạn đã nói, tôi chỉ sử dụng một bộ dữ liệu nhỏ nên tôi sẽ sử dụng giải pháp khác. Dù sao cũng cảm ơn bạn! – Joshua

+0

Yup-- đối với các tập dữ liệu nhỏ, câu trả lời của "newacct" là cách để đi. – 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]; 
} 

này trả về số đối tượng khác nhau giữa hai mảng (so sánh là với isEqual)

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