[英]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.