创建一个 NSSet 数组,该数组具有另一个 NSArray 中存在的对象的不同属性值
Create an array of NSSet having values of distinct properties of an object present in another NSArray
我有一个包含具有不同属性的对象的数组。我想创建一个集合数组,其中包含具有与对象的单个 属性 相同值的对象。
假设这是一个包含 属性 a 和 b
的对象数组
1: {a:10, b:5}, 2: {a:2,b:5}, 3: {a:20,b:5}, 4: {a:5,b:5}, 5: {a:4,b:20}, 6: {a:51,b:20}
我想创建另一个包含 NSSet
个对象的数组,这些对象具有不同的值 属性 b
因此结果将是以下 2 的数组 NSSet
1: {a:10, b:5}, {a:2,b:5}, {a:20,b:5}, {a:5,b:5}
2: {a:4,b:20}, {a:51,b:20}
如何做到这一点?
我首先创建一个集合字典,其中字典的键是 "b" 的唯一值。
注意:这是未经测试的代码。这里可能有错别字。
NSArray *objectArray = ... // The array of "SomeObject" with the "a" and "b" values;
NSMutableDictionary *data = [NSMutableDictionary dictionary];
for (SomeObject *object in objectArray) {
id b = object.b;
NSMutableSet *bSet = data[b];
if (!bSet) {
bSet = [NSMutableSet set];
data[b] = bSet;
}
[bSet addObject:object];
}
NSArray *setArray = [data allValues];
setArray
将包含您的集合数组。
此代码还假设您在 SomeObject
class.
上有一个健全的 isEqual:
和 hash
实现
您可以这样做:
NSArray *data = @[@{@"a":@10, @"b":@5}, @{@"a":@2,@"b":@5}, @{@"a":@4,@"b":@20}, @{@"a":@51,@"b":@20}];
NSSet *bSet = [NSSet setWithArray: [data valueForKey: @"b"]];
NSMutableArray *filteredArray = [[NSMutableArray alloc] initWithCapacity: bSet.count];
for (NSNumber *bValue in bSet) {
NSPredicate *anArrayFilterPredicate = [NSPredicate predicateWithBlock:^BOOL(NSDictionary *aDictionaryData, NSDictionary *bindings) {
if ([aDictionaryData[@"b"] isEqual:bValue]) {
return YES;
}
return NO;
}];
NSArray *uniqueBValueArray = [data filteredArrayUsingPredicate:anArrayFilterPredicate];
[filteredArray addObject:uniqueBValueArray];
}
NSLog(@"filteredArray = %@", filteredArray);
使用键值编码,我们可以获得对象的不同值数组。然后你可以很容易地计算出你想要的结果。
在你的情况下,可以这样做。
NSArray *arrayOfDistinctObjects = [array valueForKeyPath:@"@distinctUnionOfObjects.b"];
NSMutableArray *newSetArray = [NSMutableArray new];
for (id value in arrayOfDistinctObjects) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.b == %@", value];
NSArray *filterArray = [array filteredArrayUsingPredicate:predicate];
NSSet *newSet = [NSSet setWithArray:filterArray];
[newSetArray addObject:newSet];
}
其中 array
是您要操作的对象数组。
arrayOfDistinctObjects
为您提供 b
.
的不同值数组
我有一个包含具有不同属性的对象的数组。我想创建一个集合数组,其中包含具有与对象的单个 属性 相同值的对象。
假设这是一个包含 属性 a 和 b
的对象数组1: {a:10, b:5}, 2: {a:2,b:5}, 3: {a:20,b:5}, 4: {a:5,b:5}, 5: {a:4,b:20}, 6: {a:51,b:20}
我想创建另一个包含 NSSet
个对象的数组,这些对象具有不同的值 属性 b
因此结果将是以下 2 的数组 NSSet
1: {a:10, b:5}, {a:2,b:5}, {a:20,b:5}, {a:5,b:5}
2: {a:4,b:20}, {a:51,b:20}
如何做到这一点?
我首先创建一个集合字典,其中字典的键是 "b" 的唯一值。
注意:这是未经测试的代码。这里可能有错别字。
NSArray *objectArray = ... // The array of "SomeObject" with the "a" and "b" values;
NSMutableDictionary *data = [NSMutableDictionary dictionary];
for (SomeObject *object in objectArray) {
id b = object.b;
NSMutableSet *bSet = data[b];
if (!bSet) {
bSet = [NSMutableSet set];
data[b] = bSet;
}
[bSet addObject:object];
}
NSArray *setArray = [data allValues];
setArray
将包含您的集合数组。
此代码还假设您在 SomeObject
class.
isEqual:
和 hash
实现
您可以这样做:
NSArray *data = @[@{@"a":@10, @"b":@5}, @{@"a":@2,@"b":@5}, @{@"a":@4,@"b":@20}, @{@"a":@51,@"b":@20}];
NSSet *bSet = [NSSet setWithArray: [data valueForKey: @"b"]];
NSMutableArray *filteredArray = [[NSMutableArray alloc] initWithCapacity: bSet.count];
for (NSNumber *bValue in bSet) {
NSPredicate *anArrayFilterPredicate = [NSPredicate predicateWithBlock:^BOOL(NSDictionary *aDictionaryData, NSDictionary *bindings) {
if ([aDictionaryData[@"b"] isEqual:bValue]) {
return YES;
}
return NO;
}];
NSArray *uniqueBValueArray = [data filteredArrayUsingPredicate:anArrayFilterPredicate];
[filteredArray addObject:uniqueBValueArray];
}
NSLog(@"filteredArray = %@", filteredArray);
使用键值编码
在你的情况下,可以这样做。
NSArray *arrayOfDistinctObjects = [array valueForKeyPath:@"@distinctUnionOfObjects.b"];
NSMutableArray *newSetArray = [NSMutableArray new];
for (id value in arrayOfDistinctObjects) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.b == %@", value];
NSArray *filterArray = [array filteredArrayUsingPredicate:predicate];
NSSet *newSet = [NSSet setWithArray:filterArray];
[newSetArray addObject:newSet];
}
其中 array
是您要操作的对象数组。
arrayOfDistinctObjects
为您提供 b
.