2013-03-29 45 views
6

Tôi có 2 nsarray, với cùng giá trị nhưng theo thứ tự khác nhau.So sánh hai mảng có cùng giá trị nhưng với một thứ tự khác nhau

NSArray * array1 = {0,1,2,3}
NSArray * array2 = {2,3,1,0}

Tôi cần một phương pháp để quyết tâm nếu hai mảng có cùng giá trị trong một thứ tự khác.

Loại

-(BOOL) isSameValues:(NSArray*)array1 and:(NSArray*)array2; 
+0

sắp xếp em và sau đó lặp lại và xem liệu mọi phần tử có phù hợp hay không. –

Trả lời

4
if ([[NSSet setWithArray:array1] isEqualToSet:[NSSet setWithArray:array2]]) { 
    // the objects are the same 
} 
+5

Điều này sẽ xem xét '[@ 1, @ 2, @ 2]' và '[@ 1, @ 1, @ 2]' bằng nhau. –

5

Cập nhật: này sẽ không hoạt động nếu mảng có yếu tố trùng lặp!

Bạn có thể tạo hai số NSSet s với các mảng đó và so sánh chúng.

NSArray * array1 = @[@0,@1,@2,@3]; 
NSArray * array2 = @[@2,@3,@1,@0]; 

NSSet *set1 = [NSSet setWithArray:array1]; 
NSSet *set2 = [NSSet setWithArray:array2]; 

NSLog(@"result %@", [set1 isEqualToSet:set2] ? @"YES" : @"NO"); 
+0

Điều này sẽ xem xét '[@ 1, @ 2, @ 2]' và '[@ 1, @ 1, @ 2]' bằng nhau. –

+0

Vâng bạn nói đúng, ví dụ của OP đã ném tôi ra khỏi –

+1

@MartinR: Không rõ ràng đó là hành vi không chính xác. Nó chứa các giá trị giống nhau. Nếu số lần xuất hiện có liên quan, chỉ cần thay đổi nó thành NSCountedSet. – Chuck

0

Đi tổng không có các yếu tố. Có một quầy. Và đặt đôi 'cho vòng lặp' để phân tích từng phần tử của nhau. Tăng số lượt truy cập tại mỗi kết hợp. Lưu ý: Điều này là hợp lệ khi tất cả các phần tử là duy nhất.

Nếu khác hoặc bạn không biết, hãy sắp xếp chúng và kết hợp từng người một.

0

Một cách khác là sử dụng NSHashTable.

- (BOOL)array:(NSArray *)array1 containsTheSameObjectsAsArray:(NSArray *)array2 { 
    if (array1.count != array2.count) { 
     return NO; 
    } 
    NSHashTable *table = [[NSHashTable alloc] initWithOptions:NSHashTableWeakMemory 
                capacity:array1.count]; 
    for (NSObject *object in array1) { 
     [table addObject:object]; 
    } 
    for (NSObject *object in array2) { 
     if (![table containsObject:object]) { 
      return NO; 
     } 
    } 
    return YES; 
} 

Lưu ý rằng NSHashTable đòi hỏi iOS 6+

18

Bạn có thể sử dụng cho mục đích đó NSCountedSet:

- (BOOL)isSameValues:(NSArray*)array1 and:(NSArray*)array2 
{ 
    NSCountedSet *set1 = [NSCountedSet setWithArray:array1]; 
    NSCountedSet *set2 = [NSCountedSet setWithArray:array2]; 
    return [set1 isEqualToSet:set2]; 
} 

NSCountedSet là một tập hợp các đối tượng khác nhau, trong đó mỗi đối tượng có một truy cập liên kết với nó . Do đó kết quả cho

NSArray *array1 = @[@0,@1,@2,@3]; 
NSArray *array2 = @[@2,@3,@1,@0]; 

YES, nhưng đối với

NSArray *array1 = @[@1,@1,@3,@3]; 
NSArray *array2 = @[@3,@3,@3,@1]; 

kết quả là NO.

+0

Tôi tự hỏi nếu chỉ phân loại mảng và sau đó so sánh sẽ là cùng một tốc độ, hoặc có khả năng nhanh hơn? –

+0

@DmitryShevchenko: I * giả sử * chèn các phần tử mảng vào bộ đếm (sử dụng phương thức 'băm' để xác định các phần tử giống hệt nhau) nhanh hơn so với sắp xếp tất cả các phần tử (hoặc ít nhất là không chậm hơn). Nhưng tôi không thể nói chắc chắn. - Trong mọi trường hợp, điều này sẽ làm việc với các mảng của các phần tử tùy ý, có thể không thể so sánh được. –

+2

đây thực sự là câu trả lời đúng –

Các vấn đề liên quan