2010-08-02 2 views

ответ

1

Спасибо, что помогли мне.

localizedCaseInsensitiveCompare

этот API будет делать сортировку по локализации. В противном случае строки разных языков будут обрабатываться как строки unicode, а сравнение не выполняется.

Вот решение:

NSComparisonResult sortLocationsForStr(NSString* str1, NSString* str2, void *context) 
{ 
    return [str1 localizedCaseInsensitiveCompare:str2]; 
} 

[myArrayToSort sortUsingFunction:sortLocationsForStr context:nil]; 
+0

Вам нужно использовать алгоритм сортировки Unicode. – tchrist

3

Все строки в Objective-C (NSString *) являются строками Unicode. Это последовательности символов юникода (в отличие от последовательностей закодированных байтов). Вы можете отсортировать массив строк, используя методы, предоставленные NSArray.

NSArray* myArray = [NSArray arrayWithObjects:@"はじめまして", @"русский язык", @"คนอ้วน ๆ", nil]; 

NSArray* mySortedArray = [myArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 

Это будет сортировать строки по их порядку Юникода, если у вас есть какое-либо другая сортировка условия затем обеспечить селектор сортировки пользовательского или уточнить свой вопрос.

+1

Что вы имеете в виду "в порядке их Unicode"? Вы имеете в виду в порядке, определенном алгоритмом сортировки Unicode? Это будет порядок Юникода. Если вы имеете в виду порядок кодов, это чистый мусор и не создает алфавитный вид. – tchrist

+0

@tchrist: +1. Я согласен, что сортировка по точечному порядку не имеет смысла. Однако этот вопрос вообще не упоминал «алфавитный порядок». Насколько я знаю, им нужен произвольный отсортированный массив для бинарного поиска? Я призвал их доработать их вопрос, и я бы уточнил свой ответ. Возможно, вы могли бы создать ответ, объясняющий, как использовать алгоритм сортировки Unicode в Objective-C? – Akusete

1

Если вы хотите отсортировать с помощью сортировки дескрипторов, вы также можете сортировать так:

NSSortDescriptor *sorter = [NSSortDescriptor descriptorWithKey:@"description" ascending:YES]; 
NSArray* mySortedArray = [myArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sorter]]; 

«описание» хорошо работает в качестве ключа для значений NSString, так как описание документально вернуть себе.

Преимущество перехода на маршрут NSSortDescriptor состоит в том, что вы можете иметь более одного дескриптора сортировки, или вы можете выбрать использовать нисходящую сортировку.

+0

Если вы хотите отсортировать массив NSStrings с дескриптором сортировки, вероятно, лучше использовать 'self' в качестве ключа. http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/doc/uid/20000052-BBCGEBBJ – JeremyP

+1

для NSString, "description" эквивалентен тем, что он всегда возвращает сам объект NSString. Я думаю, что это менее запутанно, чем «я», которое может быть неверно истолковано как класс, выполняющий вызов, а не объекты в массиве ... –

Смежные вопросы