最近项目需求做一个通讯录,并且需要使用姓名大写字母作为索引。然而后台返回的数据并没有给这些需要的数据。所以只能自己获取,然后碰到了怎样获取联系人姓名大写首字母的问题,记录一下:
//获取字符串首字母(传入汉字字符串, 返回大写拼音首字母)
+ (NSString *)getFirstLetterFromString:(NSString *)aString
{
//转成了可变字符串
NSMutableString *str = [NSMutableString stringWithString:aString];
//先转换为带声调的拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
//再转换为不带声调的拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
//转化为大写拼音
NSString *strPinYin = [str capitalizedString];
//获取并返回首字母
return [strPinYin substringToIndex:1];
}
******************************
做项目的时候还写了一个由字符串数组按首字母分组得到字典的方法,如下:
//将字符串数组,按首字母分组,得到“字母”对“相应子字符串数组”的字典
+ (NSDictionary *)getDicWithArray:(NSArray *)arrNames
{
NSMutableDictionary *dictFirstLetterToNames = [NSMutableDictionary dictionary];
for (NSString *name in arrNames)
{
//获取到姓名的大写首字母
NSString *strFirstLetter = [ABUtil getFirstLetterFromString:name];
//如果该字母对应的模型不为空(即签名已经有过该首字母的名字了)
//则将这个姓名加入到这个首字母对应的姓名数组中
if (dictFirstLetterToNames[strFirstLetter])
{
[dictFirstLetterToNames[strFirstLetter] addObject:name];
}
else//没有出现过该首字母,则往字典中新增一组key-value
{
//新建一个可变长数组,用于存储该首字母对应的姓名
NSMutableArray *arrGroupNames = [NSMutableArray arrayWithObject:name];
//将首字母-姓名数组作为key-value加入到字典中
[dictFirstLetterToNames setObject:arrGroupNames forKey:strFirstLetter];
}
}
return dictFirstLetterToNames;
}
由于后台返回的是一个通讯录信息的数组,所以我需要转化为“名字首字母”:“对应模型数组”的字典,类似{@”A”:@[contact1,contact2],@”B”:@[contact3,contact4]}的字典,转换方法如下:
//由响应得到的模型对象数组,获取“姓名首字母-模型对象数组”字典(用来做索引)
+ (NSMutableDictionary *)getFirstLetterToModelsDict:(NSArray *)array
{
NSMutableDictionary *dictFirLetToModels = [NSMutableDictionary dictionary];
//对得到的通讯录列表模型数组便利
for (DTOContactsInfo *contact in array)
{
//获取这一模型对应的姓名的首字母
NSString *nameFirstLetter = [ABUtil getFirstLetterFromString:contact.name];
//如果首字母已经在字典中有了,那么直接将对象添加到这个字母对应的模型对象数组中
if ([[dictFirLetToModels allKeys] containsObject:nameFirstLetter])
{
//#warning TODO: 这里可以对数组进行汉字排序,只有这样才能每个组里面的列表也按照姓名拼音排序
//对对象数组for循环,当compareName(a.name,b.name)>0的时候,插在后面
//#warning TODO: 汉字拼音排序暂时未实现
[(NSMutableArray *)dictFirLetToModels[nameFirstLetter] addObject:contact];
}
else
{
//如果之前没有这个首字母,则往字典中新加入一个@“首字母”:可变数组的元素
NSMutableArray *arrSubModels = [NSMutableArray array];
[arrSubModels addObject:contact];
[dictFirLetToModels setObject:arrSubModels forKey:nameFirstLetter];
}
}
return dictFirLetToModels;
}
接下来,可以探讨一下传入一个汉字数组,然后让它们按拼音排序的方法:
//然而我还并没有思考这个东西咬怎么写,先留个位置
******************************************************************************
然而下面是我最开始的时候,想的特别复杂,脑子抽了写出来的办法,是为了获取首字母对模型数组的字典的方法,这个方法也能大体实现功能,但是会导致同名的只能获取到最前面的一个,所以不可取,而且整个方法也太复杂了,是在是没有值得借鉴的地方,写下来做个教训!
//由响应得到的模型对象数组,获取“姓名首字母-模型对象数组”字典(用来做索引)
+ (NSMutableDictionary *) getDictByModelArray:(NSArray *)array
{
//从模型对象数组获取到对应的姓名数组
NSMutableArray *arrNames = [NSMutableArray array];
for (DTOContactsInfo *contactInfo in array)
{
[arrNames addObject:contactInfo.name];
}
//姓名做key,模型对象做value,建立一一对应的字典
NSDictionary *dictNameToModel = [NSDictionary
dictionaryWithObjects:array
forKeys:arrNames];
//将姓名转化为拼音字符串、然后获取姓名对应的大写首字母的字典
NSDictionary *dictFirstLetterToNames = [ABUtil getDicWithArray:arrNames];
//将dictFirstLetterToNames中每个首字母对应的姓名数组按文字排序
#warning TODO: 这里需要对数组进行汉字排序,只有这样才能每个组里面的列表也按照姓名拼音排序
#warning TODO: 汉字拼音排序暂时未实现
//根据“首字母--姓名数组”和“姓名--模型对象”两个字典,转化为需要的“首字母-模型对象”字典
//新建可变数组,用于保存各个首字母对应的模型数组(之后用于“首字母-模型对象”字典的初始化)
NSMutableArray *arrSubModels = [NSMutableArray array];
//下面开始往这个新建的数组中写数据
//对“首字母--姓名数组”字典的value遍历
for (NSArray *arrSubNames in [dictFirstLetterToNames allValues])
{
//新建可变数组用于保存姓名数组对应的模型数组
NSMutableArray *arrModelsFromNames = [NSMutableArray array];
//对名字数组中的每个名字遍历
for (NSString *name in arrSubNames)
{
//得到名字对应的model对象,并假如到模型数组中
[arrModelsFromNames addObject:dictNameToModel[name]];
}
//将得到的“首字母”对应的“模型对象”数组加入到arrSubModels中,用于初始化“首字母-模型对象”字典
[arrSubModels addObject:arrModelsFromNames];
}
//使用tempFirstLetter做key,对应的model类型数组做value构成字典
NSArray *tempFirstLetter = [dictFirstLetterToNames allKeys];
NSMutableDictionary *dictFirLetToModels = [NSMutableDictionary dictionaryWithObjects:arrSubModels forKeys:tempFirstLetter];
//返回字典
return dictFirLetToModels;
}