创建一个 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.

的不同值数组