将数组按字母顺序拆分为多个数组iOS

时间:2015-02-24 10:59:41

标签: ios objective-c arrays

我有一个看起来像

的数组
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'

3 个答案:

答案 0 :(得分:2)

您已将NSMutableArray方法filterUsingPredicateNSArray方法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
 // }