2012-05-26 4 views
1

У меня есть изменяемый массив со следующим содержанием:Добавление нескольких значений в NSSet

2012-05-26 23:38:09.606 [8147:f803] log (
     { 
     send = david; 
     receive = mike; 
     message = test me; 
    }, 
     { 
     send = david; 
     receive = daddy; 
     message = test me; 

    }, 
     { 
     send = david; 
     receive = daddy; 
     message = test me; 

    } 
) 

Я найти значение дубликатов, как это:

NSSet *uniquearray = [[NSSet alloc] init]; 
uniquearray = [[NSSet setWithArray: myArray] valueForKey:@"receive"]; 

2012-05-26 23:38:09.609 [8147:f803] log (
    mike, 
    daddy 
) 

Но если я хочу получить сообщение, как я может это сделать? Я просто хочу что-то вроде Take (перестроить nsarray возможно)

2012-05-26 23:38:09.609 [8147:f803] log (
    { 
     receive = mike, 
     message = test me; 
}, 
{ 
     receive = daddy 
     message = test me; 
}) 

Спасибо.

+1

«хотите принять сообщение»? запутанный вопрос запутан. Вы можете повторить свой вопрос. –

+0

Вы пытаетесь получить один объект из набора или все из них? – Perception

+0

все из них.thx – XcodeMania

ответ

3

Вы должны прояснить свое мышление о том, что вы хотите. Например, что, если два сообщения «папа» имели разный контент? Кого бы вы хотели? Или вы хотите сохранить оба?

Если вы хотите сохранить все уникальные сообщения и не заботиться о порядке, вы можете сделать:

NSSet* uniqueSet = [NSSet setWithArray:myArray]; 

Если вы можете потребовать IOS 5.0 или более поздней версии, вы можете использовать NSOrderedSet сохранить порядок:

NSOrderedSet* uniqueSet = [NSOrderedSet orderedSetWithArray:myArray]; 

Если вы хотите сохранить одно сообщение от каждого приемника, вы можете сделать что-то вроде этого:

NSMutableArray* uniqueArray = [NSMutableArray array]; 
NSMutableSet* seen = [NSMutableSet set]; 
for (NSDictionary* dict in myArray) 
{ 
    NSString* receiver = [dict objectForKey:@"receiver"]; 
    if (![seen containsObject:receiver]) 
    { 
     [uniqueArray addObject:dict]; 
     [seen addObject:receiver]; 
    } 
} 

Как в стороне, вы не должны называть переменную uniquearray, когда это не массив, а набор. Во-вторых, этот код:

NSSet *uniquearray = [[NSSet alloc] init]; 
uniquearray = [[NSSet setWithArray: myArray] valueForKey:@"receive"]; 

Выделяет один пустой набор, а затем выбрасывает указатель на него, заменив указатель с указателем на другой набор. Первый объект полностью потерян. Если вы не используете ARC, он также просочился.

+0

thx за вашу помощь. это работает – XcodeMania