Индексирование отсортированного по алфавиту списка - PullRequest
1 голос
/ 03 февраля 2010

У меня есть массив со списком объектов, отсортированных по алфавиту, игнорируя регистр букв (используется метод lowerCaseString), и мне нужно отсортировать его в массив массивов, по одному на каждую букву +1 для не альфа-символов.

Простым способом сделать это было бы перебрать исходный массив с гигантским стеком 27 if else if else if else....Излишне говорить, что я не думаю, что это очень хорошее решение, поэтому я подумал, смогу ли я преобразовать первую букву строки, по которой я сортирую, в целое число, которое я мог бы затем использовать для вычисления индекса для сортировки объекта в.

Поэтому мне нужна помощь в реализации этого или в поиске лучшего способа сделать это.

Я работаю на платформе iPhone, поэтому у меня есть доступ к библиотекам какао и основных яблок.

Ответы [ 2 ]

3 голосов
/ 03 февраля 2010

Вы можете использовать «отсортированный» NSMutableArray, и он будет содержать ваши 27 «буквенные» объекты NSMutableArray, каждый из которых содержит ваши объекты.

Вы также можете использовать NSArray из 26 букв (как объекты NSString) и использовать indexOfObject:, чтобы получить индекс из «отсортированного» массива массива «букв», в который должен быть добавлен объект (если он возвращает NSNotFound , используйте 26 в качестве индекса, поскольку это ваш не альфа-массив).

Например, если вы сортируете объекты NSString, вы можете сделать это следующим образом:

NSArray *originalArray = [NSArray arrayWithObjects:@"A object",@"B object",@"C object",@"123 object",nil];

// init with all 26 lowercase letters here
NSArray *letters = [NSArray arrayWithObjects:@"a",@"b",@"c",nil];

// create sorted and letter arrays
NSMutableArray *sortedArray = [[NSMutableArray alloc] initWithCapacity:[letters count]+1];
for (int i = 0; i < [letters count] + 1; i++) {
    // use an appropriate capacity here
    NSMutableArray *letterArray = [[NSMutableArray alloc] initWithCapacity:10];
    [sortedArray addObject:letterArray];
    [letterArray release];
}

// sort originalArray into sortedArray
for (NSString *string in originalArray) {
    NSString *firstLetter = [[string substringWithRange:[string rangeOfComposedCharacterSequenceAtIndex:0]] lowercaseString];

    int index = [letters indexOfObject:firstLetter];
    if (index == NSNotFound) {
        // use non-alpha array
        index = [letters count];
    }

    NSMutableArray *letterArray = [sortedArray objectAtIndex:index];
    [letterArray addObject:string];
}

NSLog(@"%@",sortedArray);
3 голосов
/ 03 февраля 2010

В обычном c, str[0] - 'a' даст вам целое число от 0 до 25 для строк, начинающихся с букв нижнего регистра. Тогда у вас просто есть один if, чтобы проверить наличие не-буквенных начальных символов.

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