美文网首页iOS点点滴滴IOSiOS工作系列
按首字母进行分组,简单搜索

按首字母进行分组,简单搜索

作者: 改变自己_now | 来源:发表于2015-12-22 17:04 被阅读602次

    需求:

    最近公司新项目中有城市选择,无奈后台给的数组是全部的省、也没有按照首字母进行分组,但要求却是要分组的,而且还要分组的索引、还支持模糊搜索。

    思路:

    1、首先对所有的省份进行排序。
    2、对排序好的省份按首字母进行分组。
    3、通过排序好的省份数组获取索引。

    实现:

    1.1、排序:
    开始我以为排序数组就直接用数组的block排序就可以了,结果发现中文排序有问题。然后在网上找了一些资料,找到了解决办法,要把中文转换为拼音再排序。
    为了代码的重用,我为NString添加了PinYin分类,分类中有把中文转拼音的方法和其他两个方法。这里贴上其实现

    - (NSString*)ChineseStringTransformToPinYin; {
    
    NSMutableString *mutableString = [[NSMutableString alloc] initWithString:self];
    
    // 转为带声调的拉丁文
    CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformMandarinLatin, NO);
    
    // 去掉声调
    CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformStripDiacritics, NO);
    
    return mutableString;
    }
    
    
    - (NSString*)fisrtUppercasePinYin {
    
    
    NSString *str = [self ChineseStringTransformToPinYin];
    
    
    return  [[str uppercaseString] substringToIndex:1];
    
    
    }
    
    
    - (BOOL)isContainChinese {
    
    for (int i = 0; i<self.length; i++) {
        
        unichar ch = [self characterAtIndex:i];
        if (0x4e00 < ch  && ch < 0x9fff) {
            return true;
        }
    }
    

    1.2、解决了中文的转拼音的问题,剩下的就是按首字分组了,新建一个类,在该类中添加分组和获取索引的两个方法。
    分组实现代码:

      /**
     *  把联系人按首字母进行排序
     *
     *  @param array 需要排序的数组
     *
     *  @return 返回按各个字母排序好数组(数组中包含数组)
     */
    + (NSMutableArray*)sortArrayByFirstLetterWithArray:(NSMutableArray*)array {
    
    NSMutableArray *sortSectionArray = [NSMutableArray array];
    
    NSString *tempString;
    
    NSMutableArray *itme;
    
    // 首先对其进行排序
    NSMutableArray *sortArray = [[array sortedArrayUsingComparator:^NSComparisonResult(NSString* obj1, NSString* obj2) {
        
        NSString *str1 = [obj1 ChineseStringTransformToPinYin];
        
        NSString *str2 = [obj2 ChineseStringTransformToPinYin];
        
        return [str1 compare:str2];
    
    
    }] mutableCopy];
    
    
    // 对其排序
    for (int i = 0; i<sortArray.count; i++) {
        
        NSString *str = sortArray[i];
        
        NSLog(@"%@",str);
        
        NSString*firstString;
        
                if (str.length>0&&![str isContainChinese]) {
        
                    firstString = [[str substringToIndex:1] uppercaseString];
                }
                else if(str.length>0&&[str isContainChinese]){
        
        
                    firstString = [str fisrtUppercasePinYin];
        
                }
                NSLog(@"%@",firstString);
        
                // 不同
                if (![tempString isEqualToString:firstString]) {
        
                    //分组
                    itme = [NSMutableArray array];
                    [itme addObject:str];
                    tempString = firstString;
                    [sortSectionArray addObject:itme];
                }
                else {
                
                    [itme addObject:str];
                }
    }
    
    return sortSectionArray;
    }
    

    获取索引方法实现

    // 通过分组数组来获取索引
     + (NSMutableArray*)getSectionIndexsArrayWithSortSecionsArray:(NSMutableArray*)sortSecionsArray {
    
    
    NSMutableArray *indexsArray = [NSMutableArray array];
    
    for (NSArray *arr in sortSecionsArray) {
        
        NSString *str = [arr firstObject];
        
        NSString *firstLetter = @"";
        
        if (str.length>0&&![str isContainChinese]) {
            
            firstLetter = [[str substringToIndex:1] uppercaseString];
            
        }
        else if (str.length>0&&[str isContainChinese]) {
            
            
            firstLetter = [str fisrtUppercasePinYin];
            
        }
        
        [indexsArray addObject:firstLetter];
        
        
    }
    
    return indexsArray;
    }
    

    最为关键的步骤完成,模糊搜索就NSPredicate就能实现 了,这里贴上搜索的简单代码

    [self.searchResultsArray removeAllObjects];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self contains[cd]%@",searchString];
    
    for (NSArray* scopeArr in self.sortArray) {
        
        [self.searchResultsArray addObjectsFromArray:[scopeArr filteredArrayUsingPredicate:predicate]];
    }
    

    Demo中的其他代码就不贴上了,有兴趣的下面链接下载。
    [点我下载Demo][1]
    [1]:https://github.com/full-of-fire/searchDemo

    相关文章

      网友评论

        本文标题:按首字母进行分组,简单搜索

        本文链接:https://www.haomeiwen.com/subject/nunmhttx.html