2009-07-21 39 views
16

Tôi hiện đang liệt kê thông qua các thành phần NSMutableArray (hoặc NSMutableSet) để tìm các bản sao và xóa chúng. Ví dụ: nếu mảng/bộ có giá trị [@"a", @"b", @"b", @"c"] thì kết quả cuối cùng phải là [@"a", @"b", @"c"].Tạo NSMutableArray hoặc NSMutableSet độc đáo

Vì tôi đang so sánh NSStrings, tôi đang sử dụng phương pháp isEqualTo: để kiểm tra xem các chuỗi có bằng nhau hay không.

Có cách nào hiệu quả hơn để xóa các mục nhập trùng lặp thay vì lặp qua tất cả các mục nhập và kiểm tra xem có trùng lặp không?

Trả lời

42

An NSSet thực hiện chính xác những gì bạn đang cố gắng làm: đó là bộ sưu tập các mục độc đáo (không theo thứ tự). Vì vậy, bạn có thể tìm thấy các mặt hàng duy nhất trong mảng của bạn như vậy:

NSSet *uniqueElements = [NSSet setWithArray:myArray]; 

// iterate over the unique items 
for(id element in uniqueElements) { 
    // do something 
} 

NSSet rất có thể sử dụng một thuật toán băm để làm chèn O (1) (so với O (n^2) để kiểm tra xem mỗi mục là duy nhất bằng cách lặp lại), nhưng tài liệu của Apple không đảm bảo như vậy, do đó bạn có lẽ không nên dựa vào chi tiết triển khai đó.

Nếu vì một lý do nào đó bạn cần giữ các mục duy nhất trong bộ sưu tập được sắp xếp (đã sắp xếp), bạn có thể biến trở lại thành một mảng với -[NSSet allObjects] và sau đó sắp xếp mảng kết quả.

+0

Cảm ơn bạn, đã làm việc! Tôi đã làm điều này để lấy các phần tử duy nhất trong mảng: // thêm để đặt để kiểm tra các tên phần tử duy nhất NSSet * uniqueNames = [NSSet setWithArray: names]; \t // trả về dữ liệu trở lại mảng tên = [[NSMutableArray alloc] initWithArray: [uniqueNames allObjects]]; – Rudi

+0

Cách mang tính đại diện hơn để lấy lại tên mảng là: id name = [[uniqueNames allObjects] giữ lại]; // nếu bạn muốn giữ tên hoặc id name = [uniqueNames allObjects]; // nếu bạn không muốn giữ lại quyền sở hữu của mảng –

+0

@BarryWark, nó sẽ không phải là O (n) cho lần lặp lại? – Peres

3

Tập hợp không bao giờ chứa các phần tử trùng lặp, do đó, việc tạo một NSMutableSet sẽ đảm bảo tính duy nhất của các giá trị.

+0

Cảm ơn bạn đã trả lời Daniel! – Rudi

4

An NSSet hoặc NSMutableSet sẽ đảm bảo rằng bạn không có đối tượng trùng lặp. Nó sẽ làm việc cho NSStrings như trong ví dụ của bạn, nhưng đối với các lớp học của riêng bạn, hãy nhớ ý bạn là "bình đẳng" và thực hiện các phương thức hashisEqual: cho phù hợp.

+0

Cảm ơn bạn đã giải thích, thật tốt khi biết rằng nó là tự động cho NSStrings. – Rudi

1

Chỉ dòng mã này sẽ hoạt động tốt.

NSSet *mySet = [NSSet setWithArray:myArray]; 

bây giờ mySet sẽ có các yếu tố độc đáo.