Сортировка массива значений типа double или CLLocationDistance на iPhone - PullRequest
4 голосов
/ 14 сентября 2009

Я пытаюсь отсортировать список значений CLLocationDistance по ближайшему расстоянию (в порядке возрастания). Сначала я преобразовал значения в NSString объекты, чтобы можно было использовать следующий вид:

NSArray *sortedArray;
sortedArray = [distances sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

NSString не может отсортировать по числовому значению.

Как установить список числовых значений в порядке возрастания?

Ответы [ 3 ]

8 голосов
/ 14 сентября 2009

Я думаю, что вы хотите sortedArrayUsingFunction:context:, используя что-то вроде этого:

NSInteger intSort(id num1, id num2, void *context)
{
    int v1 = [num1 intValue];
    int v2 = [num2 intValue];
    if (v1 < v2)
        return NSOrderedAscending;
    else if (v1 > v2)
        return NSOrderedDescending;
    else
        return NSOrderedSame;
}

// sort things
NSArray *sortedArray; sortedArray = [anArray sortedArrayUsingFunction:intSort context:NULL];

справочник по документам Apple

1 голос
/ 14 сентября 2009

Попробуйте использовать sortedArrayUsingSelector, где вы определяете функцию для сравнения элементов здесь: http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#//apple_ref/occ/instm/NSArray/sortedArrayUsingSelector:

0 голосов
/ 14 сентября 2009

Когда вы конвертируете значения в строки, сортировка будет лексикографической, а не числовой, что не соответствует вашим запросам. CLLocationDistance определяется как тип double в соответствии с документами Apple. Учитывая это, создайте свои NSArray с NSNumber экземплярами, инициализированными с вашими CLLocationDistance данными (см. numberWithDouble), и используйте реализацию сортировки NSArray для них.

Больше о NSNumber здесь здесь .

...