我有一个由自定义类对象形成的NSArray
。该类具有3个字符串属性(城市,州,邮政编码)。我想从array
中获取所有唯一的州值。
我阅读了NSPredicate
类,但无法理解如何在这种情况下使用它。我能找到的唯一示例都是针对字符串操作的。
请问有人能帮帮我吗?
我有一个由自定义类对象形成的NSArray
。该类具有3个字符串属性(城市,州,邮政编码)。我想从array
中获取所有唯一的州值。
我阅读了NSPredicate
类,但无法理解如何在这种情况下使用它。我能找到的唯一示例都是针对字符串操作的。
请问有人能帮帮我吗?
看看键路径(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"
非常简单的一行代码:
NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]];
技巧在于使用NSArray
的valueForKey:
方法。该方法将迭代您的数组(myArrayOfCustomObjects
),对每个对象调用-state
方法,并构建结果数组。然后,我们使用结果状态数组创建一个NSSet
以去除重复项。
NSOrderedSet
。有序集合的优点是它会删除任何重复项,但同时也保持相对顺序。NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"];
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states];
NSSet *uniqueStates = [orderedSet set];
NSOrderedSet
代替Set
以保持顺序。 - Preetam Jadakar