iPhone – 从NSArray对象获取唯一的值
我有一个自定义类的对象组成的NSArray
。 这个类有3个(城市,州,邮编)string属性。 我想从array
获取所有独特的状态值。
我没有读过NSPredicate
类,但在这种情况下不能使用它。 我能find的唯一例子就是string操作。
有人可以帮我吗?
完全简单的一行:
NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]];
诀窍是NSArray
的valueForKey:
方法。 这将迭代你的数组( 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"