[英]What is the best way to get unique set of objects from an array in objective C
I have an array with list of model objects 我有一个带有模型对象列表的数组
model object has properties Name, Age, gender, I have date as follows 模型对象具有属性名称,年龄,性别,我的日期如下
user* user1.name = "Bob",
user1.age = "10",
user1.gender = "M",
user* user2.name = "Bob",
user2.age = "11",
user2.gender = "M",
user* user3.name = "Woz",
user3.age = "15",
user3.gender = "M",
user* user4.name = "Woz",
user4.age = "16",
user4.gender = "M",
Now I need to get the unique name and lesser age as result. 现在,我需要获得唯一的名称并降低年龄。
user* user1.name = "Bob",
user1.age = "10",
user1.gender = "M",
user* user3.name = "Woz",
user3.age = "15",
user3.gender = "M",
what would be the efficient way to derive the above result. 得出上述结果的有效方法是什么? Thanks In advance Any Hint or help would appreciated. 在此先感谢任何提示或帮助将不胜感激。
You can simply iterate the array looking for the youngest users, storing each one in a dictionary keyed by name. 您可以简单地迭代数组以寻找最年轻的用户,将每个用户存储在以名称为关键字的字典中。 Once you have iterated the array simply get all of the dictionary values as an array; 迭代数组后,只需将所有字典值作为数组即可;
-(NSArray*)getYoungestUniqueUsersFromArray:(NSArray*)users {
NSMutableDictionary* youngestUsersDict = [NSMutableDictionary new];
for (User* user in users) {
User* currentUser = youngestUsersDict[user.name];
if (currentUser == nil || user.age < currentUser.age) {
youngestUsersDict[user.name]=user;
}
}
NSArray* youngestUsers = [youngestUsersDict allValues];
return youngestUsers;
}
@interface User : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) NSString *gender;
@end
@implementation User
+ (instancetype)create:(NSString *)name gender:(NSString *)gender age:(int)age {
User *user = [[User alloc] init];
user.name = name;
user.gender = gender;
user.age = age;
return user;
}
- (BOOL)isEqual:(id)object {
if ([object isKindOfClass:[User class]]) {
return [[(User *)object name] isEqualToString:self.name];
}
return NO;
}
- (NSUInteger)hash {
return self.name.hash;
}
@end
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *users = @[[User create:@"Bob" gender:@"M" age:11],
[User create:@"Bob" gender:@"M" age:9],
[User create:@"Bob" gender:@"M" age:10],
[User create:@"Woz" gender:@"M" age:25],
[User create:@"Woz" gender:@"F" age:36],
[User create:@"Woz" gender:@"F" age:23]];
users = [users sortedArrayWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
User *a = obj1;
User *b = obj2;
NSComparisonResult nameResult = [a.name compare:b.name];
if (nameResult == NSOrderedSame) {
return a.age > b.age;
}
return nameResult;
}];
NSSet *unique = [NSSet setWithArray:users];
for (User *user in unique) {
NSLog(@"%@: %zd - %@", user.name, user.age, user.gender);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.