【问题标题】:iPhone - getting unique values from NSArray objectiPhone - 从 NSArray 对象获取唯一值
【发布时间】:2010-11-29 04:49:44
【问题描述】:

我有一个由自定义类的对象组成的NSArray。该类具有 3 个(城市、州、邮编)字符串属性。我想从array 获取所有唯一的状态值。

我确实通读了NSPredicate 课程,但无法说明在这种情况下如何使用它。我能找到的唯一例子是字符串操作。

有人可以帮帮我吗?

【问题讨论】:

    标签: iphone nsarray nspredicate


    【解决方案1】:

    看看keypaths。它们非常强大,我大部分时间都使用它们而不是 NSPredicate 类。以下是您在示例中使用它们的方式...

    NSArray *uniqueStates;
    uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"];
    

    注意使用 valueForKeyPath 而不是 valueForKey

    这是一个更详细/人为的例子......

    NSDictionary *arnold = [NSDictionary dictionaryWithObjectsAndKeys:@"arnold", @"name", @"california", @"state", nil];
    NSDictionary *jimmy = [NSDictionary dictionaryWithObjectsAndKeys:@"jimmy", @"name", @"new york", @"state", nil];
    NSDictionary *henry = [NSDictionary dictionaryWithObjectsAndKeys:@"henry", @"name", @"michigan", @"state", nil];
    NSDictionary *woz = [NSDictionary dictionaryWithObjectsAndKeys:@"woz", @"name", @"california", @"state", nil];
    
    NSArray *people = [NSArray arrayWithObjects:arnold, jimmy, henry, woz, nil];
    
    NSLog(@"Unique States:\n %@", [people valueForKeyPath:@"@distinctUnionOfObjects.state"]);
    
    // OUTPUT
    // Unique States:
    // "california",
    // "michigan",
    // "new york"
    

    【讨论】:

    • 警告:valueForKeyPath:@"@distinctUnionOfObjects.PROPERTY" 不保留排序顺序。
    • 感谢@RobertAltman 指出这一点。我想这节省了我一些调试时间
    • 如果要键的对象是一个数组并且值存在于它的第一个索引上怎么办?
    • 如果我不仅要返回该字典的值怎么办?
    • 使用NSOrderedSet 代替Set 来保持顺序
    【解决方案2】:

    完全简单的一个班轮:

    NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]];
    

    诀窍是NSArrayvalueForKey: 方法。这将遍历您的数组 (myArrayOfCustomObjects),在每个对象上调用 -state 方法,并构建一个结果数组。然后,我们创建一个 NSSet 并使用生成的状态数组来删除重复项。


    从 iOS 5 和 OS X 10.7 开始,有一个新类也可以做到这一点:NSOrderedSet。有序集的优点是它会删除所有重复项,但也会保持相对顺序。

    NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"];
    NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states];
    NSSet *uniqueStates = [orderedSet set];
    

    【讨论】:

    • 虽然我也喜欢@distinctUnionOfObjects 的强大功能,因此用户可能给出了Corey 给出的答案,但在此解决方案中使用这种简洁方法的好处是保留了排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2013-12-04
    • 1970-01-01
    • 2011-11-15
    • 2019-10-20
    • 2020-11-13
    相关资源
    最近更新 更多