iPhone - 从NSArray对象获取唯一值

los*_*sit 55 iphone nsarray nspredicate

我有NSArray一个自定义类的对象.该类有3个(city,state,zip)字符串属性.我想从中得到所有独特的状态值array.

我确实通读了这个NSPredicate课程,但在这种情况下无法充分利用它.我能找到的唯一例子是字符串操作.

有人可以帮帮我吗?

pro*_*rey 136

看一下keypaths.它们非常强大,我大部分时间都使用它们代替NSPredicate类.以下是您在示例中使用它们的方法......

NSArray *uniqueStates;
uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"];
Run Code Online (Sandbox Code Playgroud)

注意使用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"
Run Code Online (Sandbox Code Playgroud)

  • 警告:valueForKeyPath:@"@ distinctUnionOfObjects.PROPERTY"不保留排序顺序. (17认同)
  • 如果我想要返回那个字典而不仅仅是价值? (4认同)

Dav*_*ong 122

完全简单的一个班轮:

NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]];
Run Code Online (Sandbox Code Playgroud)

诀窍是valueForKey:方法NSArray.这将遍历您的array(myArrayOfCustomObjects),-state在每个对象上调用方法,并构建结果数组.然后,我们NSSet使用生成的状态数组创建一个以删除重复项.


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

NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"];
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states];
NSSet *uniqueStates = [orderedSet set];
Run Code Online (Sandbox Code Playgroud)