2012-02-27 3 views
2

Я вытаскиваю файл XML с сервера, канал содержит вокзалы и их местоположения широты и долготы.Сортировка массива NSDictionaries по значению внутри одного из ключей

Мне удалось создать NSArray, полный NSDictionary объектов, каждый из которых соответствует станции.

В словаре есть ключ для широты и ключа для долготы. У меня также есть объект CLLocation с расположением устройства.

Я знаю, как рассчитать расстояние между устройством и каждой станцией, но расстояние не является частью словаря. Я хотел бы отсортировать массив по порядку расстояния от устройства.

Как бы я это сделал? Не знаю, с чего начать, и Google или мои книги не очень полезны для меня! Буду признателен за любую оказанную помощь.

+2

Это сообщение есть ответ на ваш вопрос: [http://stackoverflow.com/questions/805547/how-to-sort-an-nsmutablearray-with-custom-objects-in-it][1 ] [1]: http://stackoverflow.com/questions/805547/how-to-sort-an-nsmutablearray-with-custom-objects-in-it – Boon

+0

Спасибо, я использовал метод блоков –

+0

Если у кого-то есть такая проблема - сделайте массив изменчивым, создайте метод с использованием быстрого перечисления, чтобы добавить другое поле в каждый словарь. Сделайте сортировку с использованием блоков (как описано в ссылке выше) –

ответ

8

Используйте следующее;

NSArray *sortedArray; 
sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *first, NSDictionary *second) { 
    // Calculate distances for each dictionary from the device 
    // ... 
    return [firstDistance compare:secondDistance]; 
}]; 
3

К сожалению, вы не можете сортировать объекты NSDictionary. Вы должны создать NSMutableArray и отсортировать его.

Смотреть это - Collections Programming Topics - Sorting Arrays

Update: Чтобы отсортировать массив словарей, которые можно использовать, например, этот метод NSArray:

sortedArray = [someArray sortedArrayUsingFunction:compareElements context:NULL]; 

В compareElements пример функции:

NSInteger compareElements (id num1, id num2, void *context) 
{ 
    int v1 = [[num1 objectForKey:@"distance"] integerValue]; 
    int v2 = [[num2 objectForKey:@"distance"] integerValue]; 
    if (v1 < v2) 
     return NSOrderedAscending; 
    else if (v1 > v2) 
     return NSOrderedDescending; 
    else 
     return NSOrderedSame; 
} 
+0

Вы можете - у него есть набор словарей. – jrtc27