iPhone - 从NSArray对象获取唯一值

56

我有一个由自定义类对象形成的NSArray。该类具有3个字符串属性(城市,州,邮政编码)。我想从array中获取所有唯一的州值。

我阅读了NSPredicate类,但无法理解如何在这种情况下使用它。我能找到的唯一示例都是针对字符串操作的。

请问有人能帮帮我吗?

2个回答

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"

17
注意:使用 valueForKeyPath:@"@distinctUnionOfObjects.PROPERTY" 无法保留排序顺序。 - Robert Altman
感谢 @RobertAltman 指出这个问题。我想这节省了我一些调试时间。 - Hulvej
如果对象键是一个数组,并且该值存在于其第一个索引上,那么怎么办? - Qamar Suleiman
4
如果我不仅想返回字典中的值,而是整个字典,该怎么办? - Abhishek
如果您有自定义类,这种方法将不起作用。如果您的数组对象是NSDictionary对象,则可以使用此方法。 - Liangjun
1
使用NSOrderedSet代替Set以保持顺序。 - Preetam Jadakar

124

非常简单的一行代码:

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

虽然我也喜欢@distinctUnionOfObjects的强大功能,因此用户probablyCorey给出的答案很好,但是这种简洁的方法在这个解决方案中的好处是保留了排序。 - idStar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接