使用包含自定义类对象的NSMutable Array

时间:2014-06-15 17:13:56

标签: ios objective-c

我有一个数组 - 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中看到随机的“描述”?

任何建议都将不胜感激,谢谢!

3 个答案:

答案 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获取随机索引。这使得伪随机数具有比randrandom更好的均匀分布,并且不要求您使用srandsrandom显式地对序列进行种子设定。

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.
}