123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- //
- // WFCUUserSectionKeySupport.m
- // WFChatUIKit
- //
- // Created by Zack Zhang on 2020/4/4.
- // Copyright © 2020 WildFireChat. All rights reserved.
- //
- #import "WFCUUserSectionKeySupport.h"
- #import "pinyin.h"
- #import "WFCUSelectedUserInfo.h"
- static NSMutableDictionary *hanziStringDictory = nil;
- @implementation WFCUUserSectionKeySupport
- + (NSMutableDictionary *)userSectionKeys:(NSArray *)userList {
- if (!userList)
- return nil;
- NSArray *_keys = @[
- @"A",
- @"B",
- @"C",
- @"D",
- @"E",
- @"F",
- @"G",
- @"H",
- @"I",
- @"J",
- @"K",
- @"L",
- @"M",
- @"N",
- @"O",
- @"P",
- @"Q",
- @"R",
- @"S",
- @"T",
- @"U",
- @"V",
- @"W",
- @"X",
- @"Y",
- @"Z",
- @"#"
- ];
-
- NSMutableDictionary *infoDic = [NSMutableDictionary new];
- NSMutableArray *_tempOtherArr = [NSMutableArray new];
- BOOL isReturn = NO;
- NSMutableDictionary *firstLetterDict = [[NSMutableDictionary alloc] init];
- for (NSString *key in _keys) {
- if ([_tempOtherArr count]) {
- isReturn = YES;
- }
- NSMutableArray *tempArr = [NSMutableArray new];
- for (id user in userList) {
- NSString *firstLetter;
- WFCCUserInfo *userInfo = (WFCCUserInfo*)user;
- NSString *userName = userInfo.displayName;
- if (userInfo.friendAlias.length) {
- userName = userInfo.friendAlias;
- }
- if (userName.length == 0) {
- userInfo.displayName = [NSString stringWithFormat:@"<%@>", userInfo.userId];
- userName = userInfo.displayName;
- }
-
- firstLetter = [firstLetterDict objectForKey:userName];
- if (!firstLetter) {
- firstLetter = [self getFirstUpperLetter:userName];
- [firstLetterDict setObject:firstLetter forKey:userName];
- }
-
-
-
- if ([firstLetter isEqualToString:key]) {
- [tempArr addObject:user];
- }
-
- if (isReturn)
- continue;
- char c = [firstLetter characterAtIndex:0];
- if (isalpha(c) == 0) {
- [_tempOtherArr addObject:user];
- }
- }
- if (![tempArr count])
- continue;
- [infoDic setObject:tempArr forKey:key];
- }
- if ([_tempOtherArr count])
- [infoDic setObject:_tempOtherArr forKey:@"#"];
-
- NSArray *keys = [[infoDic allKeys]
- sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
-
- return [obj1 compare:obj2 options:NSNumericSearch];
- }];
- NSMutableArray *allKeys = [[NSMutableArray alloc] initWithArray:keys];
- if ([allKeys containsObject:@"#"]) {
- [allKeys removeObject:@"#"];
- [allKeys insertObject:@"#" atIndex:allKeys.count];
- }
- NSMutableDictionary *resultDic = [NSMutableDictionary new];
- [resultDic setObject:infoDic forKey:@"infoDic"];
- [resultDic setObject:allKeys forKey:@"allKeys"];
- [infoDic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
- NSMutableArray *_tempOtherArr = (NSMutableArray *)obj;
- [_tempOtherArr sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
- WFCUSelectedUserInfo *user1 = (WFCUSelectedUserInfo *)obj1;
- WFCUSelectedUserInfo *user2 = (WFCUSelectedUserInfo *)obj2;
- NSString *user1Pinyin = [[self class] hanZiToPinYinWithString:user1.displayName];
- NSString *user2Pinyin = [[self class] hanZiToPinYinWithString:user2.displayName];
- return [user1Pinyin compare:user2Pinyin];
- }];
- }];
- return resultDic;
- }
- + (NSString *)getFirstUpperLetter:(NSString *)hanzi {
- NSString *pinyin = [self hanZiToPinYinWithString:hanzi];
- NSString *firstUpperLetter = [[pinyin substringToIndex:1] uppercaseString];
- if ([firstUpperLetter compare:@"A"] != NSOrderedAscending &&
- [firstUpperLetter compare:@"Z"] != NSOrderedDescending) {
- return firstUpperLetter;
- } else {
- return @"#";
- }
- }
- + (NSString *)hanZiToPinYinWithString:(NSString *)hanZi {
- if (!hanZi) {
- return nil;
- }
- if (!hanziStringDictory) {
- hanziStringDictory = [[NSMutableDictionary alloc] init];
- }
-
- NSString *pinYinResult = [hanziStringDictory objectForKey:hanZi];
- if (pinYinResult) {
- return pinYinResult;
- }
- pinYinResult = [NSString string];
- for (int j = 0; j < hanZi.length; j++) {
- NSString *singlePinyinLetter = nil;
- if ([self isChinese:[hanZi substringWithRange:NSMakeRange(j, 1)]]) {
- singlePinyinLetter = [[NSString
- stringWithFormat:@"%c", pinyinFirstLetter([hanZi characterAtIndex:j])]
- uppercaseString];
- }else{
- singlePinyinLetter = [hanZi substringWithRange:NSMakeRange(j, 1)];
- }
-
- pinYinResult = [pinYinResult stringByAppendingString:singlePinyinLetter];
- }
- [hanziStringDictory setObject:pinYinResult forKey:hanZi];
- return pinYinResult;
- }
- + (BOOL)isChinese:(NSString *)text
- {
- NSString *match = @"(^[\u4e00-\u9fa5]+$)";
- NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF matches %@", match];
- return [predicate evaluateWithObject:text];
- }
- @end
|