这个是项目中遇到了这样一个需求:
要求把后台返回的数据即一大堆城市模型 按城市名的首字母排序:
NSSortDescriptor * sd1 = [NSSortDescriptor sortDescriptorWithKey:@"pinyin" ascending:YES];
这里的这个key @"pinyin" 是模型的一个属性 在执行排序的算法中 只会调用该属性的get方法,不会调用set方法
这里对pinyin的属性解释一些 这是自己定义的一个属性jsonModel使用Ignore
把城市名通过
NSMutableString *str = [self.cityName mutableCopy];
CFStringTransform(( CFMutableStringRef)str, NULL, kCFStringTransformMandarinLatin, NO);
CFStringTransform((CFMutableStringRef)str, NULL, kCFStringTransformStripDiacritics, NO);
[str stringByReplacingOccurrencesOfString:@" " withString:@""];
这个方法 即可转为拼音
写getter方法的使用可以使用懒加载的方式 这样有力于节约系统性能
NSArray * sdArray = [NSArray arrayWithObject:sd1];
NSArray * serializeArray = [(NSArray *)_pmodel.cityList sortedArrayUsingDescriptors:sdArray];
NSSortDescriptor 这个类很强大 可以详细了解一下
char lastC = '1';
NSMutableArray *data;
NSMutableArray *oth = [[NSMutableArray alloc] init];
for (LWCityMdoel * user in serializeArray) {
char c = [user.pinyin characterAtIndex:0];
if (!isalpha(c)) {
[oth addObject:user];
}else if (c != lastC){
lastC = c;
if (data && data.count > 0) {
[self.modelArray addObject:data];
}
data = [[NSMutableArray alloc] init];
[data addObject:user];
}
else {
[data addObject:user];
}
}
if (data && data.count > 0) {
[self.modelArray addObject:data];
}
if (oth.count > 0) {
[self.modelArray addObject:oth];
}
这里是把排序过的数组 再重新分一下组
[_tableView reloadData];
刷新数据
这里有几个把小写字母转为大写的方法
char c = 'a';
[NSString stringWithFormat:@"%c", toupper(c)];
或者 @“a”
[@"a" capitalizedString] 这个是首字母大写
欢迎大神指正~~~~~~~~~~