JXChatChineseString.m 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. //
  2. // ChineseString.m
  3. // https://github.com/c6357/YUChineseSorting
  4. //
  5. // Created by BruceYu on 15/4/19.
  6. // Copyright (c) 2015年 BruceYu. All rights reserved.
  7. //
  8. #import "JXChatChineseString.h"
  9. @implementation JXChatChineseString
  10. #pragma mark - 返回tableview右方 indexArray
  11. +(NSMutableArray*)IndexArray:(NSArray*)stringArr
  12. {
  13. NSMutableArray *tempArray = [self ReturnSortChineseArrar2:stringArr];
  14. NSMutableArray *A_Result = [NSMutableArray array];
  15. NSString *tempString ;
  16. for (NSString* object in tempArray)
  17. {
  18. NSString *pinyin = [((JXChatChineseString*)object).pinYin substringToIndex:1];
  19. //不同
  20. if(![tempString isEqualToString:pinyin])
  21. {
  22. // NSLog(@"IndexArray----->%@",pinyin);
  23. [A_Result addObject:pinyin];
  24. tempString = pinyin;
  25. }
  26. }
  27. return A_Result;
  28. }
  29. #pragma mark - 返回联系人
  30. +(NSMutableArray*)LetterSortArray:(NSArray*)stringArr
  31. {
  32. NSMutableArray *tempArray = [self ReturnSortChineseArrar:stringArr];
  33. NSMutableArray *LetterResult = [NSMutableArray array];
  34. NSMutableArray *item = [NSMutableArray array];
  35. NSString *tempString;
  36. //拼音分组
  37. for (NSString* object in tempArray) {
  38. NSString *pinyin = [((JXChatChineseString*)object).pinYin substringToIndex:1];
  39. NSString *string = ((JXChatChineseString*)object).string;
  40. memberData *model = ((JXChatChineseString*)object).dataM;
  41. NSDictionary *dict = @{@"title":string,@"model":model};
  42. //不同
  43. if(![tempString isEqualToString:pinyin])
  44. {
  45. //分组
  46. item = [NSMutableArray array];
  47. [item addObject:dict];
  48. [LetterResult addObject:item];
  49. //遍历
  50. tempString = pinyin;
  51. }else//相同
  52. {
  53. [item addObject:dict];
  54. }
  55. }
  56. return LetterResult;
  57. }
  58. +(NSMutableArray*)ReturnSortChineseArrar2:(NSArray*)stringArr
  59. {
  60. //获取字符串中文字的拼音首字母并与字符串共同存放
  61. NSMutableArray *chineseStringsArray=[NSMutableArray array];
  62. for(int i=0;i<[stringArr count];i++)
  63. {
  64. JXChatChineseString *chineseString = [[JXChatChineseString alloc]init];
  65. chineseString.string = [NSString stringWithString:[stringArr objectAtIndex:i]];
  66. //chineseString.string = [NSString stringWithFormat:@"%@",dict.userNickName];
  67. //chineseString.dataM = [stringArr objectAtIndex:i];
  68. if(chineseString.string == nil){
  69. chineseString.string = @"";
  70. }
  71. //去除两端空格和回车
  72. chineseString.string = [chineseString.string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  73. //这里我自己写了一个递归过滤指定字符串 RemoveSpecialCharacter
  74. chineseString.string = [JXChatChineseString RemoveSpecialCharacter:chineseString.string];
  75. // NSLog(@"string====%@",chineseString.string);
  76. //判断首字符是否为字母
  77. NSString *regex = @"[A-Za-z]+";
  78. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
  79. NSString *initialStr = [chineseString.string length]?[chineseString.string substringToIndex:1]:@"";
  80. if ([predicate evaluateWithObject:initialStr])
  81. {
  82. NSLog(@"chineseString.string== %@",chineseString.string);
  83. //首字母大写
  84. chineseString.pinYin = [chineseString.string capitalizedString] ;
  85. }else{
  86. if(![chineseString.string isEqualToString:@""]){
  87. NSString *pinYinResult = [NSString string];
  88. for(int j=0;j<chineseString.string.length;j++){
  89. NSString *singlePinyinLetter = [[NSString stringWithFormat:@"%c",
  90. pinyinFirstLetterXXX([chineseString.string characterAtIndex:j])]uppercaseString];
  91. // NSLog(@"singlePinyinLetter ==%@",singlePinyinLetter);
  92. pinYinResult = [pinYinResult stringByAppendingString:singlePinyinLetter];
  93. }
  94. chineseString.pinYin = pinYinResult;
  95. }else{
  96. chineseString.pinYin = @"";
  97. }
  98. }
  99. //NSDictionary *dictData= @{@"nickName":chineseString,@"dataArr": chineseString.dataM};
  100. [chineseStringsArray addObject:chineseString];
  101. }
  102. //按照拼音首字母对这些Strings进行排序
  103. NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"pinYin" ascending:YES]];
  104. [chineseStringsArray sortUsingDescriptors:sortDescriptors];
  105. // for(int i=0;i<[chineseStringsArray count];i++){
  106. // NSLog(@"chineseStringsArray====%@",((ChineseString*)[chineseStringsArray objectAtIndex:i]).pinYin);
  107. // }
  108. NSLog(@"-----------------------------");
  109. return chineseStringsArray;
  110. }
  111. ///////////////////
  112. //
  113. //返回排序好的字符拼音
  114. //
  115. ///////////////////
  116. +(NSMutableArray*)ReturnSortChineseArrar:(NSArray*)stringArr
  117. {
  118. //获取字符串中文字的拼音首字母并与字符串共同存放
  119. NSMutableArray *chineseStringsArray=[NSMutableArray array];
  120. for(int i=0;i<[stringArr count];i++)
  121. {
  122. JXChatChineseString *chineseString = [[JXChatChineseString alloc]init];
  123. //chineseString.string = [NSString stringWithString:[stringArr objectAtIndex:i]];
  124. memberData *dict=[stringArr objectAtIndex:i];
  125. chineseString.string = [NSString stringWithFormat:@"%@",dict.userNickName];
  126. chineseString.dataM = [stringArr objectAtIndex:i];
  127. if(chineseString.string == nil){
  128. chineseString.string = @"";
  129. }
  130. //去除两端空格和回车
  131. chineseString.string = [chineseString.string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  132. //这里我自己写了一个递归过滤指定字符串 RemoveSpecialCharacter
  133. chineseString.string = [JXChatChineseString RemoveSpecialCharacter:chineseString.string];
  134. // NSLog(@"string====%@",chineseString.string);
  135. //判断首字符是否为字母
  136. NSString *regex = @"[A-Za-z]+";
  137. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
  138. NSString *initialStr = [chineseString.string length]?[chineseString.string substringToIndex:1]:@"";
  139. if ([predicate evaluateWithObject:initialStr])
  140. {
  141. NSLog(@"chineseString.string== %@",chineseString.string);
  142. //首字母大写
  143. chineseString.pinYin = [chineseString.string capitalizedString] ;
  144. }else{
  145. if(![chineseString.string isEqualToString:@""]){
  146. NSString *pinYinResult = [NSString string];
  147. for(int j=0;j<chineseString.string.length;j++){
  148. NSString *singlePinyinLetter = [[NSString stringWithFormat:@"%c",
  149. pinyinFirstLetterXXX([chineseString.string characterAtIndex:j])]uppercaseString];
  150. // NSLog(@"singlePinyinLetter ==%@",singlePinyinLetter);
  151. pinYinResult = [pinYinResult stringByAppendingString:singlePinyinLetter];
  152. }
  153. chineseString.pinYin = pinYinResult;
  154. }else{
  155. chineseString.pinYin = @"";
  156. }
  157. }
  158. //NSDictionary *dictData= @{@"nickName":chineseString,@"dataArr": chineseString.dataM};
  159. [chineseStringsArray addObject:chineseString];
  160. }
  161. //按照拼音首字母对这些Strings进行排序
  162. NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"pinYin" ascending:YES]];
  163. [chineseStringsArray sortUsingDescriptors:sortDescriptors];
  164. // for(int i=0;i<[chineseStringsArray count];i++){
  165. // NSLog(@"chineseStringsArray====%@",((ChineseString*)[chineseStringsArray objectAtIndex:i]).pinYin);
  166. // }
  167. NSLog(@"-----------------------------");
  168. return chineseStringsArray;
  169. }
  170. #pragma mark - 返回一组字母排序数组
  171. +(NSMutableArray*)SortArray:(NSArray*)stringArr
  172. {
  173. NSMutableArray *tempArray = [self ReturnSortChineseArrar:stringArr];
  174. //把排序好的内容从ChineseString类中提取出来
  175. NSMutableArray *result = [NSMutableArray array];
  176. for(int i=0;i<[stringArr count];i++){
  177. [result addObject:((JXChatChineseString*)[tempArray objectAtIndex:i]).string];
  178. NSLog(@"SortArray----->%@",((JXChatChineseString*)[tempArray objectAtIndex:i]).string);
  179. }
  180. return result;
  181. }
  182. //过滤指定字符串 里面的指定字符根据自己的需要添加 过滤特殊字符
  183. +(NSString*)RemoveSpecialCharacter: (NSString *)str {
  184. NSRange urgentRange = [str rangeOfCharacterFromSet: [NSCharacterSet characterSetWithCharactersInString: @",.?、 ~¥#&<>《》()[]{}【】^@/£¤|§¨「」『』¢¬ ̄~@#&*()——+|《》$_€"]];
  185. if (urgentRange.location != NSNotFound)
  186. {
  187. return [self RemoveSpecialCharacter:[str stringByReplacingCharactersInRange:urgentRange withString:@""]];
  188. }
  189. return str;
  190. }
  191. @end