2009-09-17 22 views
50

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

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

有人可以帮我吗?

回答

117

的完全简单一个衬里:

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]; 
+0

虽然我也很喜欢@distinctUnionOfObjects的力量,因此,得到的答复用户probablyCorey了,这种简洁的方式在这里这个解决方案的益处是订单保存。 – idStar 2016-01-29 18:56:41

134

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

注意:valueForKeyPath:@“@ distinctUnionOfObjects.PROPERTY”不保留排序顺序。 – 2011-12-07 22:09:57

+0

感谢@罗伯特阿尔特曼,指出了这一点。我想这节省了我一些调试时间 – Hulvej 2013-07-22 16:31:02

+0

如果key的对象是一个数组并且它的第一个索引中存在该值,该怎么办? – 2014-01-28 21:44:36