iPhone - 从NSArray对象获取唯一值

时间:2009-09-17 15:24:39

标签: iphone nsarray nspredicate

我有一个NSArray形成了自定义类的对象。该类有3个(city,state,zip)字符串属性。我想从array获得所有唯一的状态值。

我确实读过了NSPredicate类,但在这种情况下无法充分利用它。我能找到的唯一例子是字符串操作。

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:136)

看看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"

答案 1 :(得分:122)

完全简单的一个班轮:

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

诀窍是valueForKey:的{​​{1}}方法。这将迭代您的数组(NSArray),在每个对象上调用myArrayOfCustomObjects方法,并构建结果数组。然后,我们使用生成的状态数组创建-state以删除重复项。


从iOS 5和OS X 10.7开始,还有一个新类可以执行此操作:NSSet。有序集的优点是它将删除任何重复项,但也保持相对顺序。

NSOrderedSet