【问题标题】:How to sort a string of characters in objective-C?如何在objective-C中对字符串进行排序?
【发布时间】:2009-01-01 15:16:18
【问题描述】:

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

理想情况下,一个函数接受一个 NSString 并返回排序后的等价物。

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

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

【问题讨论】:

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


【解决方案1】:
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 安全的。

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

    • 最后一行包含使用正确的类方法进行的编辑。
    • @vmanjz - 你是对的。看起来您的“编辑”被系统拒绝了,所以我手动修复了它。 (s/initWithUTF8String/stringWithUTF8String/)
    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2013-04-04
    • 2012-02-24
    • 2023-02-13
    相关资源
    最近更新 更多