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

时间:2009-01-01 15:16:19

标签: iphone objective-c algorithm memory-management sorting

我正在寻找一种Objective-C方法,根据this问题的答案对字符串中的字符进行排序。

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

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

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

2 个答案:

答案 0 :(得分:9)

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安全。

答案 1 :(得分:1)

使用有界代码集,基数排序最好:

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,只需执行(c = 0; c <= 127; c ++)。