繁体   English   中英

如何在Objective-C中对字符串进行排序?

[英]How to sort a string of characters in objective-C?

我在寻找一个字符串中的字符进行排序,按照答案的一个Objective-C的方式这个问题。

理想情况下,该函数采用NSString并返回排序的等效项。

另外,我想对3个或更多重复序列进行长度编码。 因此,例如“ mississippi”首先变成“ iiiimppssss”,然后可以通过编码为“ 4impp4s”来缩短。

我不是Objective-C专家(更多的Java和C ++背景知识),所以我也想知道一些关于内存管理(保留计数等-iPhone上没有GC)的最佳实践的线索。该函数的返回值。 我的源字符串在iPhone搜索栏控件中, NSString *也是如此。

int char_compare(const char* a, const char* b) {
    if(*a < *b) {
        return -1;
    } else if(*a > *b) {
        return 1;
    } else {
        return 0;
    }
}

NSString *sort_str(NSString *unsorted) {
    int len = [unsorted length] + 1;
    char *cstr = malloc(len);
    [unsorted getCString:cstr maxLength:len encoding:NSISOLatin1StringEncoding];
    qsort(cstr, len - 1, sizeof(char), char_compare);
    NSString *sorted = [NSString stringWithCString:cstr encoding:NSISOLatin1StringEncoding];
    free(cstr);
    return sorted;
}

返回值是自动释放的,因此,如果要保留在调用方中,则需要保留它。 不是Unicode安全的。

对于有界的代码集,基数排序是最好的:

NSString * sortString(NSString* word) {
    int rads[128];
    const char *cstr = [word UTF8String];
    char *buff = calloc([word length]+1, sizeof(char));
    int p = 0;
    for(int c = 'a'; c <= 'z'; c++) {
        rads[c] = 0;
    }
    for(int k = 0; k < [word length]; k++) {
        int c = cstr[k];
        rads[c]++;
    }
    for(int c = 'a'; c <= 'z'; c++) {
        int n = rads[c];
        while (n > 0) {
            buff[p++] = c;
            n--;
        }
    }
    buff[p++] = 0;
    return [NSString stringWithUTF8String: buff];
}

请注意,以上示例仅适用于小写字母(从需要排序小写字符串的特定应用程序复制而来)。 要扩展它以处理所有ASCII 127,只需执行for(c = 0; c <= 127; c ++)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM