我正在寻找一种Objective-C方法,根据this问题的答案对字符串中的字符进行排序。
理想情况下,该函数接受NSString并返回已排序的等效项。
另外,我想运行3次或更多次重复的长度编码序列。因此,例如“mississippi”首先变成“iiiimppssss”,然后可以通过编码缩短为“4impp4s”。
我不是Objective-C(更多Java和C ++背景)的专家,所以我也想知道处理内存管理的最佳实践是什么(保留计数等等 - 在iphone上没有GC )为这样一个函数的返回值。我的源字符串位于iPhone搜索栏控件中,因此是NSString *
。
答案 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 ++)。