Как отсортировать строку символов в Objective-C?

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

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

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

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


person frankodwyer    schedule 01.01.2009    source источник
comment
проверьте это - alishabdar.com/2010/06/15/   -  person Saurabh    schedule 31.03.2011


Ответы (2)


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;
}

Возвращаемое значение освобождается автоматически, поэтому, если вы хотите сохранить его в вызывающем объекте, вам нужно его сохранить. Не безопасен для Юникода.

person sprintf    schedule 01.01.2009

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

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];
}

Обратите внимание, что приведенный выше пример работает только для строчных букв (скопированных из определенного приложения, которому необходимо сортировать строки в нижнем регистре). Чтобы расширить его для обработки всех 127 символов ASCII, просто выполните for(c=0; c ‹= 127; c++).

person Dave Dopson    schedule 08.05.2012
comment
Последняя строка содержит правку с правильным методом класса. - person vmanjz; 13.10.2012
comment
@vmanjz - вы правы. Похоже, ваше редактирование было отклонено системой, поэтому я исправил его вручную. (s/initWithUTF8String/строкаWithUTF8String/) - person Dave Dopson; 20.10.2012