1. 程式人生 > >【iOS開發】---- 通訊錄字典序

【iOS開發】---- 通訊錄字典序

       最近專案中有個客戶列表,需要對客戶(Customer)做字典序排列且按A~Z~#分組展示。下面記錄了我的實現方法(如果你有更好的方法,請不吝分享):

       最終目標: 獲得一個字典dic{key:value,…}, key:A~Z和#, value:是一個數組,儲存customer物件,物件按名稱字典序排列。 實現步驟: 1.獲取客戶列表資料,進行json解析時將客戶名稱轉拼音(且均轉為大寫)給Customer物件儲存,解析完成得到儲存Customer物件的陣列customersArray; 2.對customersArray進行排序,讓Customer物件以字典序排列,得到排序後的陣列customersSortedArray(我這裡得到的順序是按照#~A~Z排列的);
3.定義一個包含26個大寫字母的陣列:AtoZ,定義一個可變字典dic(最終展示要用到的就是這個了)。遍歷customersSortedArray,如果首字母firstLetter包含在AtoZ中,從dic中獲取以鍵為firstLetter陣列(如陣列不存在,則建立它),將客戶新增到此陣列中;如果首字母firstLetter不包含在AtoZ中,從dic中獲取以鍵為’#’陣列(如陣列不存在,則建立它),將客戶新增到此陣列中(由於早已對客戶進行了字典排序,所以在這裡新增到陣列之後任然是字典序)。程式碼實現如下:
 for (int i = 0; i < [arr count]; i++)
    {
        Customer *cstr= arr[i];
        NSString *firstLetter = [[NSString stringWithFormat:@"%c",[cstr.phonetic characterAtIndex:0]] uppercaseString];
        NSString *key = [AtoZ containsObject:firstLetter] ? firstLetter : @"#";

        NSMutableArray *arrStartWithKey = mDic[key];
        if (!arrStartWithKey) {
            arrStartWithKey = [[NSMutableArray alloc] init];
            [mDic setObject:arrStartWithKey forKey:key];
            [arrStartWithKey release];
        }
        [arrStartWithKey addObject:cstr];
    }

4.將獲得的資料dic展示在介面即可。 這裡有點不完善的地方,就是多音字,上面在轉拼音過程中,有個加強版,但也只能解決少許問題,這個比較麻煩,暫時還沒有解決辦法,如果你有解決辦法,請分享一下,謝謝~