2015-08-15 42 views
1

我有一个NSArray,其中包含MyCustomObject的实例;每个都有一个NSString,称为firstName获取NSArray中的所有对象,其字符串属性以特定字母开头

该阵列由属性排序,从A到Z

我只希望这些对象那里firstName开始以字母A

例如,假设我的数组有100个对象。

1. Apple 
2. Ace 
3. Article 
4. Ball 
5. Cat 
6. Camel 
.... 

100. Zebra 

在这里,我只想要“Apple”,“Ace”和“Article”。

+0

你担心性能或通过循环整个数组和做字符串查找一个正确的路径? –

+1

根据您以前的(现已删除的)问题,您不想迭代列表,只查找以A开头的项目,然后再用B等等,仅迭代列表一次。根据其起始字母将每个项目放入适当的“桶”中。重复列表26次将会很糟糕。 – rmaddy

+0

顺便说一句 - 你应该更新你的问题来解释你真的想要做什么。根据当前问题得出的答案并不适合你真正想要做的事情,即将原始列表拆分为字母表中每个字母的单独数组。 – rmaddy

回答

0

你可以这样做:

NSIndexSet* indexes = [array indexesOfObjectsPassingTest:^BOOL(CustomObject* obj, NSUInteger idx, BOOL *stop){ 
    return [obj.firstName rangeOfString:@"a" options:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch | NSAnchoredSearch].location != NSNotFound; 
}]; 
NSArray* matchingObjects = [array objectsAtIndexes:indexes]; 
+0

这是一个伟大而有效的答案。然而,使用for循环并将A B C D E ... Z放在rangeOfString中,以便单独获取所有数组是很好的方法吗? @Ken Thomases –

+1

不,这不是一个非常有效的方法。当您检查其firstName的第一个字母时,您只需循环一次数组,并将对象添加到适当的数组中。 –

+0

不,我想每个字母字符集必须在一个单数组中,并且该数组应该放入NSDictionary中。例如键'A'将具有所有名字以A开头的对象,'B'键将具有所有名字以B字母开头的对象。 –

1

您可以在NSPredicate通过谓词

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.firstName beginswith[c] %@",<value>]; 
NSArray *result = [array filteredArrayUsingPredicate:predicate]; 

滤波器阵列欲了解更多详情,请登录本link

+0

什么是? –

+0

每个你想要的@“A”或@“B”.... @“Z” –

+1

这是一个很好的答案,通过谓词搜索总是一个好的和可行的选项 –

相关问题