2012-05-14 3 views
18

내 응용 프로그램에는 personId 속성이있는 Person 클래스가 있습니다.
는 지금은목표 c - NSMutableSet 고유 한 개체 속성

그래서 내가 내 데이터 구조로 NSMutableSet를 사용해야 추측 독특한 Person 객체의 무리 (독특한 = 다른 personId)를 잡고 일부 데이터 구조를 필요로하지만 방법은 내가 NSMutableSet이 때 personId 속성을 비교해야합니까 사람을 추가합니다 (그래서 나는 같은 사람을 더 추가하지 않을 것입니다)?

내 목표는 (내가 동일한 ID를 가진 두 사람을 추가하더라도) 항상 고유 한 사람의 콜렉션을 갖는 것입니다. NSMutableSet이 나를 위해 모든 노력을 기울이고, 이미 존재하는 사람은 그것을 두 번 추가하지 않을 것입니다.

답변

32

NSSet의 비교 방법을 이해하면됩니다. 새 개체를 집합에 추가하면 각 집합의 요소에 대해 isEqual: 메서드 (NSObject 메서드)가 호출됩니다. 그래서 당신이 할 수있는 일이 메소드를 오버라이드 (override)과 같은 사용자 정의 비교를 제공 할 수 있습니다 :

참고 :

당신은

// 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

감사합니다 이것은 내가 무엇을 찾고 있었는지입니다. – Eyal

+0

내 personId가 NSString 인 경우 한 가지만 해시 방법을 재정의해야합니까? – Eyal

+1

'[self.personId intValue]'와 같이 int로 변환하면됩니다. 그리고 비교를 위해서 :'[self.personId isEqualToString : anObject.personId]' – Alladinian

0

배열에 항목을 추가 할 때이 점에 대해 걱정할 필요가 없습니다. 매번 고유 한 객체를 추가하는 동안에는 객체의 속성이 중요하지 않아야합니다.

걱정하고 두 배로 확실하기를 원하면 NSMutableSet을 대신 사용하십시오 (각 객체의 순서를 유지할 필요가없는 경우).

당신은 같은 값을 가진 개체를 추가하기 전에 존재하지 않음을 확인하는 술어를 사용할 수

업데이트. 이 NSMutableArray 및 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]; 
} 

매우 거친 의사 그러나 희망은 요점을 :) 수는

+0

뿐만 아니라 isEqual: 방법 당신 해야 재정 hash 메소드를 오버라이드 (override)하는 경우 내 목표는 고유 한 사람의 컬렉션을 항상 가지고있는 것입니다 (동일한 ID로 두 사람을 추가하더라도) NSMutableSet이 나를 위해 열심히 노력하고 내가 이미 존재하는 사람을 추가하고 싶습니다. 두 번 추가하지 마십시오 .. – Eyal

+0

술어를 사용하여 객체가 이미 동일한 값으로 존재하는지 확인할 수 있습니다. 편집을 참조하십시오. – CaptainRedmuff

+0

NSMutableSet은 사람 ID를 자동으로 확인하지 않습니다. 두 개체가 실제로 똑같은 개체를 가리키는 경우에만 두 개체가 동일하다고 간주합니다. 아래 명시된대로 사전을 사용하는 것이 좋습니다. 그것은 당신을 위해 동일한 personID를 대체 할 것입니다. –

4

나는 당신이 원하는 것은 personIdPerson 객체에 매핑, NSMutableDictionary 생각합니다.

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

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

(나중에 dict을 릴리스해야 함). 지정된 personId에 대한 Person 클래스 (12 말)을 찾기 위해

, 당신은 간단하게 수행 할 수 있습니다

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

참고 : 당신이 (당신이 키와 객체와 같은 값을 모두 저장해야한다는 기본 유형을 저장할 수 없음).

+0

제발 봐 내 질문에 더 많은 것을 설명했다 – Eyal

+1

@Eyal 내 대답은 당신이 원하는대로 할 것이라고 생각한다; 같은'personId'를 가진 다른 객체를 추가하면 오래된'Person' 객체가 대체 될 것입니다. – trojanfoe