Как отсортировать строку символов в target-C? - PullRequest
1 голос
/ 01 января 2009

Я ищу способ сортировки символов в строке Objective-C согласно ответу на этот вопрос.

В идеале функция, которая принимает NSString и возвращает отсортированный эквивалент.

Кроме того, я хотел бы запустить последовательности кодирования длины из 3 или более повторов. Так, например, «Миссисипи» сначала становится «iiiimppssss», а затем может быть сокращено путем кодирования как «4impp4s».

Я не являюсь экспертом в Objective-C (более опыт Java и C ++), поэтому я также хотел бы получить некоторую подсказку о том, как лучше всего обращаться с управлением памятью (сохранить счет и т. Д. - нет GC на iPhone ) для возвращаемого значения такой функции. Моя исходная строка находится в элементе управления на панели поиска iPhone, как и NSString *.

Ответы [ 2 ]

9 голосов
/ 01 января 2009
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 голос
/ 08 мая 2012

С ограниченным набором кодов лучше всего использовать радикальную сортировку:

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 ++). </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...