2012-05-14 39 views
18

Trong ứng dụng của tôi, tôi có một lớp Person với thuộc tính personId.
Bây giờ tôi cần một số cấu trúc dữ liệu để tổ chức một loạt các độc đáo Person đối tượng (unique = khác nhau PersonId)Mục tiêu c - NSMutableSet thuộc tính đối tượng duy nhất

Vì vậy, tôi đoán tôi nên sử dụng NSMutableSet như cấu trúc dữ liệu của tôi, nhưng làm thế nào để làm cho NSMutableSet so sánh personId tài sản khi thêm một người (vì vậy tôi sẽ không thêm cùng một người nhiều hơn những người đó)?

Mục tiêu của tôi là có một bộ sưu tập những người độc đáo mọi lúc (ngay cả khi tôi thêm hai người có cùng id), tôi muốn NSMutableSet sẽ làm tất cả công việc khó khăn cho tôi và nếu tôi thêm người đã tồn tại nó sẽ không thêm nó hai lần.

Trả lời

32

Bạn có thể đạt được điều đó bằng cách hiểu cách so sánh được thực hiện bởi NSSet. Khi bạn thêm một đối tượng mới vào tập hợp, phương thức isEqual: được gọi (phương thức NSObject) đối với từng phần tử của tập hợp. Vì vậy, những gì bạn có thể làm là ghi đè phương pháp này và cung cấp một so sánh tùy chỉnh như thế này:

LƯU Ý:

Nếu bạn ghi đè isEqual: phương pháp bạn phải override hash phương pháp cũng

// In your Person.m 
- (BOOL)isEqual:(id)anObject 
{ 
    return [self.personId isEqual:anObject.personId]; 
    // If it's an object. Otherwise use a simple comparison like self.personId == anObject.personId 
} 

- (NSUInteger)hash 
{ 
    return self.personId; //Must be a unique unsigned integer 
} 
+0

cảm ơn đây là những gì tôi đang tìm kiếm :) – Eyal

+0

chỉ một điều, nếu personId của tôi là NSString, tôi nên ghi đè phương thức băm như thế nào? – Eyal

+1

Chỉ cần đưa nó vào một int như thế này: '[self.personId intValue]'. Và để sử dụng so sánh của bạn: '[self.personId isEqualToString: anObject.personId]' – Alladinian

0

Bạn không cần phải lo lắng về điều này khi bạn đang thêm các mục vào một mảng. Miễn là bạn đang thêm một đối tượng duy nhất mỗi lần, các thuộc tính của đối tượng không quan trọng.

Nếu bạn lo lắng về điều này và muốn chắc chắn gấp đôi, hãy sử dụng NSMutableSet thay thế (trừ khi bạn cần duy trì thứ tự của từng đối tượng).

Cập nhật

Bạn có thể sử dụng một vị để kiểm tra xem một đối tượng với cùng một giá trị không tồn tại trước khi thêm nó. Điều này sẽ làm việc tốt với cả NSMutableArray và NSMutableSet.

//create array 
NSMutableArray *array = [[NSMutableArray alloc] init]; 

//create person 
Person *newPerson = [[Person alloc] init]; 

//add person 
[array addObject:newPerson] 

//check new object exists 
if([[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"personID == %@", [newPerson personID]]] count] == 0) 
{ 
    //add object 
    [array addObject:newPerson]; 
} 

giả Rất thô nhưng hy vọng bạn sẽ có được các ý chính :)

+0

My mục tiêu là có một bộ sưu tập những người độc đáo mọi lúc (ngay cả khi tôi thêm hai người với cùng một id), tôi muốn NSMutableSet sẽ làm việc chăm chỉ cho tôi và nếu tôi thêm một người đã tồn tại, nó đã thắng Không thêm nó hai lần .. – Eyal

+0

Bạn có thể sử dụng một vị từ để kiểm tra xem một đối tượng đã tồn tại với cùng một giá trị chưa - xem các chỉnh sửa của tôi. – CaptainRedmuff

+0

NSMutableSet sẽ không tự động kiểm tra id người. Nó sẽ xem xét rằng hai đối tượng là như nhau chỉ khi họ thực sự cả hai điểm đến cùng một đối tượng chính xác. Bạn tốt hơn với từ điển như được nêu dưới đây. Nó sẽ làm thay thế các personID giống hệt nhau cho bạn. –

4

Tôi nghĩ rằng những gì bạn muốn là một NSMutableDictionary, lập bản đồ personId đến đối tượng Person.

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 

Person *person = something; 
[dict setObject:personObj forKey:[NSNumber numberWithInt:[person personId]]]; 
... etc ... 

(đừng quên tiết lộ dict sau đó ở đâu đó).

Để tìm thấy những lớp Person cho quy định personId (12, nói), bạn chỉ có thể làm:

Person *person = [dict objectForKey:[NSNumber numberWithInt:12]]; 

Lưu ý: bạn phải lưu trữ tất cả các chìa khóa và giá trị như các đối tượng (bạn không thể lưu trữ các kiểu nguyên thủy).

+0

xin vui lòng xem tôi giải thích thêm trong câu hỏi của tôi – Eyal

+1

@ Cuối cùng tôi nghĩ rằng câu trả lời của tôi sẽ làm những gì bạn muốn; nếu bạn thêm một đối tượng khác với cùng 'personId' thì đối tượng' Person' cũ sẽ được thay thế. – trojanfoe

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