我有一个数组 - placeObjectsArray,它包含许多名为place的对象。 Place是PlaceHolder类的对象,我在其中创建了不同的属性,填充了数据:
self.place = [[PlaceHolder alloc]init];
// A lot of code here during parson XML with data
[self.placeObjectsArray addObject:self.place];
此文件的标题如下所示:
@interface PlaceHolder : NSObject
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *description;
@property (strong, nonatomic) NSString *webPage;
它实际上是一个实体的容器,每个容器都包含名称,描述,图像链接等数据。现在,我有一个带有放置对象的数组。我想要的,操纵数组中的对象。例如,我怎样才能找到特定“名称”的所有数据? (Name是PlaceHolder类中的属性之一)。我怎么能创建一个只包含名称的数组?我怎么能在控制台10中看到随机的“描述”?
任何建议都将不胜感激,谢谢!
答案 0 :(得分:2)
您可以使用NSPredicates:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name LIKE[cd] %@", nameSearch];
NSArray *filtered = [self.placeObjectsArray filteredArrayUsingPredicate:predicate];
答案 1 :(得分:2)
你问了很多不同的问题。
首先,如何选择数组中与特定名称匹配的项目:创建NSPredicate并使用filteredArrayUsingPredicate。谷歌NSPredicate,你应该找到很多例子。
或者,您可以使用indexesOfObjectsPassingTest
获取数组中与搜索条件匹配的项的索引集,然后使用objectsAtIndexes:
将索引集转换为子数组。
至于如何从数组中的条目中获取所有名称,您可以在键值编码中使用非常酷的技巧。
如果您发送一个数组valueForKey消息,它会尝试使用该键从数组中的每个条目获取一个项目,并将它们全部返回到一个新数组中。代码如下所示:
NSArray *names = [placeObjectsArray valueForKey @"name"];
获取10个随机描述有点复杂。您需要编写循环遍历数组的代码,选择10个随机项,并将每个项的描述附加到新的可变数组中。
诀窍是使用arc4random_uniform在数组中获取随机索引:
NSUInteger random_index = arc4random_uniform(placeObjectsArray.count);
我把剩下的作为学习练习留给你了。
如果你想获取10个随机描述,并确保你永远不会两次获取相同的描述,那就更复杂了。您需要创建数组的可变副本,然后遍历副本,获取随机项,将其描述添加到数组中,并从数组中删除项。
答案 2 :(得分:1)
您可以遍历数组,查找具有给定名称的PlaceHolder
,例如:
PlaceHolder *namedPlaceholder = nil;
for (PlaceHolder *placeholder in theArray) {
if ([placeholder.name isEqualToString:"whateverName"]) {
namedPlaceholder = placeholder;
break;
}
}
如果您想有效地找到PlaceHolders,可以考虑使用字典而不是数组。使用字典,您可以将名称映射到对象,例如:
NSMutableDictionary *myDictionary = [[NSMutableDictionary alloc] init];
myDictionary[@"foo"] = somePlaceholder;
myDictionary[@"bar"] = someOtherPlaceholder;
并检索它们:
PlaceHolder *somePlaceholder = myDictionary[@"foo"];
要从数组中获取随机对象,我建议使用arc4random_uniform
获取随机索引。这使得伪随机数具有比rand
或random
更好的均匀分布,并且不要求您使用srand
或srandom
显式地对序列进行种子设定。
PlaceHolder *randomPlaceholder = theArray[arc4random_uniform(theArray.count)];
或
const NSUInteger arrayCount = theArray.count;
for (NSUInteger j = 0; j < 10; j++) {
PlaceHolder *randomPlaceholder = theArray[arc4random_uniform(arrayCount)];
// Do something with randomPlaceholder.
}