我有一个看起来像
的数组NSArray *array=@[@"apple",@"animal",@"ant",@"beat",@"bean".....];
我需要按字母顺序拆分成多个数组
我正在添加我尝试过的代码
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH 'a'"];
NSArray *aElements = [arrLastName filterUsingPredicate:predicate];
NSPredicate工作得很好但是在第二行我遇到了错误 我不需要解决这个错误。唯一的事情是将数组重组为多个数组alphabatecilly
Initializing 'NSArray *__strong' with an expression of incompatible type 'void'
答案 0 :(得分:2)
您已将NSMutableArray
方法filterUsingPredicate
与NSArray
方法filteredArrayUsingPredicate
混淆。前者修改接收器NSMutableArray
并返回void。后者使原始数组保持不变并返回一个新数组。
所以你想要的是 -
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH 'a'"];
NSArray *aElements = [arrLastName filteredArrayUsingPredicate:predicate];
但是这种方法需要您多次迭代数组。我会使用以下方法 -
NSMutableDictionary *alphaArrays=[NSMutableDictionary new];
for (NSString *word in arrLastName) {
NSString *firstletter=[word substringToIndex:1];
NSMutableArray *wordArray=alphaArrays[firstletter];
if (wordArray == nil) {
wordArray=[NSMutableArray new];
alphaArrays[firstletter]=wordArray;
}
[wordArray addObject:word];
}
答案 1 :(得分:1)
问题在于filterUsingPredicate:
它会过滤NSMutableArray
本身并且它不会返回任何内容(返回类型为void
)。
您需要使用filteredArrayUsingPredicate:
(它返回已过滤的NSArray
)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH 'a'"];
NSArray *aElements = [arrLastName filteredArrayUsingPredicate:predicate];
检查NSMutableArray Class reference,您可以看到声明的方法:
- (void)filterUsingPredicate:(NSPredicate *)predicate
- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate
答案 2 :(得分:1)
使用这个库,很容易解决LinqToObjectiveC https://github.com/ColinEberhardt/LinqToObjectiveC
此库具有以下方法groupBy https://github.com/ColinEberhardt/LinqToObjectiveC#groupBy
NSArray* input = @[@"James", @"Jim", @"Bob"];
NSDictionary* groupedByFirstLetter = [input linq_groupBy:^id(id name) {
return [name substringToIndex:1];
}];
// the returned dictionary is as follows:
has two keys "J" and "B" and corresponding arrays as values
// {
// J = ("James", "Jim"); - First Array
// B = ("Bob"); - Second Array
// }