2009-01-01 81 views
1

我正在尋找一種Objective-C的方式來排序字符串中的字符,根據this問題的答案。如何在Objective-C中對字符串進行排序?

理想情況下,一個函數需要一個NSString並返回已排序的等價物。

另外我想運行長度爲3或更多的重複編碼序列。因此,例如「密西西比」首先變成「iiiimppssss」,然後可以通過編碼縮短爲「4impp4s」。我不是專家在Objective-C(更多的Java和C + +背景),所以我也想知道什麼是處理內存管理的最佳做法(保留計數等 - 沒有GC上的GC iphone)爲這樣一個函數的返回值。我的源字符串位於iPhone搜索欄控件中,因此是NSString *

+0

看看這個 - http://www.alishabdar.com/2010/06/15/adding-easy-to-use-sorting-features-to-objective-c-arrays/ – Saurabh 2011-03-31 08:47:04

回答

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

+0

不適用於ios ... 。 – SuperString 2012-08-10 15:53:58

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++)。

+1

最後一行包含使用正確的類方法編輯。 – vmanjz 2012-10-13 10:24:04

相關問題