iPhone – 从NSArray对象获取唯一的值

我有一个自定义类的对象组成的NSArray 。 这个类有3个(城市,州,邮编)string属性。 我想从array获取所有独特的状态值。

我没有读过NSPredicate类,但在这种情况下不能使用它。 我能find的唯一例子就是string操作。

有人可以帮我吗?

完全简单的一行:

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

诀窍是NSArrayvalueForKey:方法。 这将迭代你的数组( myArrayOfCustomObjects ),在每个对象上调用-state方法,并构build一个结果数组。 然后,我们创build一个NSSet与所产生的状态数组来删除重复。


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

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

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