【问题标题】:sort array alphabeticaly using custom order使用自定义顺序按字母顺序对数组进行排序
【发布时间】:2014-08-04 12:11:38
【问题描述】:

我正在尝试像在音乐应用程序中一样对数组进行排序:ABCDEFG...АБВГ...#547368%; 这是排序:

 NSString *sortOrder = @"AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzАаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЭэЮюЯя_0123456789";
    NSComparator comp = ^NSComparisonResult(id obj1, id obj2)
    {
        char char1 = [(NSString *)obj1 characterAtIndex: 0];
        char char2 = [(NSString *)obj2 characterAtIndex: 0];

        int index1;
        for (index1 = 0; index1 < sortOrder.length; index1++)
            if ([sortOrder characterAtIndex: index1] == char1)
                break;

        int index2;
        for (index2 = 0; index2 < sortOrder.length; index2++)
            if ([sortOrder characterAtIndex: index2] == char2)
                break;

        if (index1 < index2)
            return NSOrderedAscending;
        else if (index1 > index2)
            return NSOrderedDescending;
        else
            return [(NSString *)obj1 compare: obj2 options: NSCaseInsensitiveSearch];
    };
     NSSortDescriptor *sortDescriptor=[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES comparator:comp];
    arrayOfContactsAndCompanies = (NSMutableArray*)[arrayOfContactsAndCompanies sortedArrayUsingDescriptors:@[sortDescriptor]];

但结果是:ABCDEFG(英文字母)..1235#45(数字)..АБВГ(俄语字母) 将俄语字母转换为 char 似乎存在问题。

【问题讨论】:

    标签: ios arrays sorting


    【解决方案1】:

    问题是当您在此处从字符串中获取字符时:

        char char1 = [(NSString *)obj1 characterAtIndex: 0];
        char char2 = [(NSString *)obj2 characterAtIndex: 0];
    

    由于char(8 位)的最大值为 127,因此当您尝试为该char 分配更大的值时会出现未定义的行为(俄语字母使用 16 位编码)。

    您只需将char 替换为unichar 即可解决您的问题。

    【讨论】:

      猜你喜欢
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多