Словарь по существу имеет такую функциональность уже. Его клавиши представляют собой набор, так что вы можете создать словарь для хранения объектов, в привязке любого атрибута вы заинтересованы в:
[NSDictionary dictionaryWithObjects:arrayOfObjects
forKeys:[arrayOfObjects valueForKey:theAttribute]];
Если вы спросите словарь для allValues
сейчас, у вас есть только один объект для каждого атрибут. Я должен упомянуть, что с этой процедурой более поздние объекты будут сохранены в пользу ранее. Если порядок исходного массива значителен, отмените его перед созданием словаря.
Вы не можете фактически поместить эти объекты в NSSet
, потому что NSSet
будет использовать isEqual:
и hash
методы Объектами, чтобы определить, должны ли они быть членами, а не ключевого атрибута (конечно, вы можете заместить эти методы если это ваш собственный класс, но это, вероятно, будет мешать их поведению в других коллекциях).
Если вы действительно чувствуете, что вам нужен набор, вам придется написать свой собственный класс. Вы можете подкласса NSSet
, но общепринятая мудрость заключается в том, что состав коллекций какао намного проще, чем подклассы. По сути, вы пишете класс, который охватывает любые методы, заданные вам интересны Вот (весьма неполно и совершенно непроверенные) эскиз:.
@interface KeyedMutableSet : NSObject
/* This selector is performed on any object which is added to the set.
* If the result already exists, then the object is not added.
*/
@property (assign, nonatomic) SEL keySEL;
- (id)initWithKeySEL:(SEL)keySEL;
- (id)initWithArray:(NSArray *)initArray usingKeySEL:(SEL)keySEL;
- (void)addObject:(id)obj;
- (NSArray *)allObjects;
- (NSArray *)allKeys;
- (BOOL)containsObject:(id)obj;
- (NSUInteger)count;
-(void)enumerateObjectsUsingBlock:(void (^)(id, BOOL *))block;
// And so on...
@end
#import "KeyedMutableSet.h"
@implementation KeyedMutableSet
{
NSMutableArray * _objects;
NSMutableSet * _keys;
}
- (id)initWithKeySEL:(SEL)keySEL
{
return [self initWithArray:nil usingKeySEL:keySEL];
}
- (id)initWithArray:(NSArray *)initArray usingKeySEL:(SEL)keySEL
{
self = [super init];
if(!self) return nil;
_keySEL = keySEL;
_objects = [NSMutableArray array];
_keys = [NSMutableSet set];
for(id obj in initArray){
[self addObject:obj];
}
return self;
}
- (void)addObject:(id)obj
{
id objKey = [obj performSelector:[self keySEL]];
if(![keys containsObject:objKey]){
[_keys addObject:objKey];
[_objects addObject:obj];
}
}
- (NSArray *)allObjects
{
return _objects;
}
- (NSArray *)allKeys
{
return [_keys allObjects];
}
- (BOOL)containsObject:(id)obj
{
return [_keys containsObject:[obj performSelector:[self keySEL]]];
}
- (NSUInteger)count
{
return [_objects count];
}
- (NSString *)description
{
return [_objects description];
}
-(void)enumerateObjectsUsingBlock:(void (^)(id, BOOL *))block
{
for(id obj in _objects){
BOOL stop = NO;
block(obj, &stop);
if(stop) break;
}
}
@end
Вам нужен только первый экземпляр каждого типа? Или произвольный экземпляр? На самом деле это не очевидное отображение из массива в набор. –
Перейдите через массив и добавьте эти объекты в NSMutableSet. – ZhangChn
Каков тип 'type'? Это строка, число, объект? – CodaFi