我有一个由自定义类的对象组成的NSArray
。该类有3个(城市,州,邮编)字符串属性。我想从array
获得所有独特的状态值。iPhone - 从NSArray对象中获取唯一值
我读过NSPredicate
类,但在这种情况下无法使用它。我能找到的唯一例子就是字符串操作。
有人可以帮我吗?
我有一个由自定义类的对象组成的NSArray
。该类有3个(城市,州,邮编)字符串属性。我想从array
获得所有独特的状态值。iPhone - 从NSArray对象中获取唯一值
我读过NSPredicate
类,但在这种情况下无法使用它。我能找到的唯一例子就是字符串操作。
有人可以帮我吗?
的完全简单一个衬里:
NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]];
诀窍是NSArray
的valueForKey:
方法。这将迭代你的数组(myArrayOfCustomObjects
),在每个对象上调用-state
方法,并构建一个结果数组。然后我们创建一个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"
注意:valueForKeyPath:@“@ distinctUnionOfObjects.PROPERTY”不保留排序顺序。 – 2011-12-07 22:09:57
感谢@罗伯特阿尔特曼,指出了这一点。我想这节省了我一些调试时间 – Hulvej 2013-07-22 16:31:02
如果key的对象是一个数组并且它的第一个索引中存在该值,该怎么办? – 2014-01-28 21:44:36
虽然我也很喜欢@distinctUnionOfObjects的力量,因此,得到的答复用户probablyCorey了,这种简洁的方式在这里这个解决方案的益处是订单保存。 – idStar 2016-01-29 18:56:41