ObjectiveC中具有特殊字符,数字,英语和阿拉伯字符串的排序数组 [英] Sorting array having special characters, numbers, English and Arabic string in objectiveC
问题描述
我正在用ObjectiveC开发一个iPhone应用程序,其中有一个包含字母数字,多语言,特殊字符数据的数组,如下所示:
I am developing an iPhone application in objectiveC in which I have one array having alphanumeric, multilingual, special character data as shown below:
(
{
name = "#";
},
{
name = "iPad";
},
{
name = "عينة";
},
{
name = "1";
},
{
name = "أ";
},
{
name = "10";
},
)
排序应为我提供如下结果,
Sorting should provide me result as below,
(
{
name = "iPad";
},
{
name = "أ";
},
{
name = "عينة";
}
{
name = "#";
},
{
name = "1";
},
{
name = "10";
},
)
首先,英语和阿拉伯语应按字母升序排列,然后是特殊字符,然后按数字升序排列.
Means first English and Arabic should be in alphabetical ascending order then special characters and then numbers in ascending order.
推荐答案
可能会有一些改进,这是您可以使用sortedArrayUsingComparator:
和自定义比较器块进行的操作.
There could be some improvement, by this is what you can do with sortedArrayUsingComparator:
and a custom comparator block.
主要思想:
-获取字符串的第一个字符.
-确定其种类"(字母,阿拉伯语,数字,其他)
-进行相应的排序.
Main idea:
- Get first char of the string.
- Determine what its "kind" (Letter, Arabic, Number, Other)
- Sort accordingly.
我从这些种类"开始:
typedef enum : NSUInteger {
CharacterOfKindArabic,
CharacterOfKindNumerical,
CharacterOfKindLetter,
CharacterOfKindOther
} CharacterOfKind;
并使用此方法获取CharacterOfKind:
And use this method to get the CharacterOfKind:
-(CharacterOfKind)retrieveFirstCharacterKindFromString:(NSString *)string
{
if ([string length])
{
unichar unicharacter = [string characterAtIndex:0];
if (unicharacter >= 0x600 && unicharacter <= 0x6ff)
return CharacterOfKindArabic;
if (unicharacter >= 0x750 && unicharacter <= 0x77f)
return CharacterOfKindArabic;
if (unicharacter >= 0xfb50 && unicharacter <= 0xfc3f)
return CharacterOfKindArabic;
if (unicharacter >= 0xfe70 && unicharacter <= 0xfefc)
return CharacterOfKindArabic;
NSString *firstChar = [string substringToIndex:1];
if ([firstChar rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet] options:0].location != NSNotFound)
return CharacterOfKindNumerical;
if ([firstChar rangeOfCharacterFromSet:[NSCharacterSet letterCharacterSet] options:0].location != NSNotFound)
return CharacterOfKindLetter;
return CharacterOfKindOther;
}
return CharacterOfKindOther;
}
我不会说阿拉伯语,也不需要用阿拉伯语编码.因此,我从网上获取了字符范围"的这些信息.我在StackOverflow的Objective-C上阅读过一些内容,但无法检索到.也许我的记忆正在和我一起玩,但是范围可能已更改(添加了更多范围).我发现该方法有点难看,但这只是要点.
I don't speak Arabic, and I never had to code with Arabic text. So I took these info of "character range" from the net. I read something on Objective-C here on StackOverflow, but I couldn't retrieve it. Maybe my memory is playing with me, but the range may have changed (more ranges added). I find the method a little ugly, but that's to get the main point.
NSString *kName = @"name";
NSArray *arrayToSort = @[@{kName:@"#"},
@{kName:@"iPhone"},
@{kName:@"iPad"},
@{kName:@"عينة"},
@{kName:@"1"},
@{kName:@"أ"},
@{kName:@"10"}];
NSLog(@"arrayToSort: %@", arrayToSort);
NSArray *typeSort = @[@(CharacterOfKindLetter), @(CharacterOfKindArabic), @(CharacterOfKindOther), @(CharacterOfKindNumerical)];
NSArray *sortedArray = [arrayToSort sortedArrayUsingComparator:^NSComparisonResult(NSDictionary * _Nonnull obj1, NSDictionary * _Nonnull obj2)
{
NSString *firstString = obj1[kName];
NSString *secondString = obj2[kName];
CharacterOfKind firstCharType = [self retrieveFirstCharacterKindFromString:firstString];
CharacterOfKind secondCharType = [self retrieveFirstCharacterKindFromString:secondString];
if (firstCharType == secondCharType) //Same Kind of first characters, do a normal "compare"
{
return [firstString compare:secondString];
}
else //Do a custom compare according typeSort
{
//Returns correctly according to the order set in typeSort
return [@([typeSort indexOfObject:@(firstCharType)]) compare:@([typeSort indexOfObject:@(secondCharType)])];
}
}];
NSLog(@"SortedArray: %@", sortedArray);
输出:
>>>arrayToSort: (
{
name = "#";
},
{
name = iPhone;
},
{
name = iPad;
},
{
name = "\U0639\U064a\U0646\U0629";
},
{
name = 1;
},
{
name = "\U0623";
},
{
name = 10;
}
)
>>>SortedArray: (
{
name = iPad;
},
{
name = iPhone;
},
{
name = "\U0623";
},
{
name = "\U0639\U064a\U0646\U0629";
},
{
name = "#";
},
{
name = 1;
},
{
name = 10;
}
)
这篇关于ObjectiveC中具有特殊字符,数字,英语和阿拉伯字符串的排序数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!