ObjectiveC中具有特殊字符,数字,英语和阿拉伯字符串的排序数组 [英] Sorting array having special characters, numbers, English and Arabic string in objectiveC

查看:148
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆