2010-07-21 2 views
5

Я пытаюсь сортировать массив, который будет выглядеть примерно так: (пожалуйста, игнорировать тот факт, что эти люди хорошо мимо любого живого возраста мне просто нужно было больших чисел!)Сортировка NSArray путем NSDictionary значения

NSDictionary *person1 = [NSDictionary dictionaryWithObjectsAndKeys:@"sam",@"name",@"28.00",@"age",nil]; 
NSDictionary *person2 = [NSDictionary dictionaryWithObjectsAndKeys:@"cody",@"name",@"100.00",@"age",nil]; 
NSDictionary *person3 = [NSDictionary dictionaryWithObjectsAndKeys:@"marvin",@"name",@"299.00",@"age",nil]; 
NSDictionary *person4 = [NSDictionary dictionaryWithObjectsAndKeys:@"billy",@"name",@"0.0",@"age",nil]; 
NSDictionary *person5 = [NSDictionary dictionaryWithObjectsAndKeys:@"tammy",@"name",@"54.00",@"age",nil]; 

NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:person1,person2,person3,person4,person5,nil]; 

// before sort 
NSLog(@"%@",arr); 

NSSortDescriptor *ageSorter = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES]; 
[arr sortUsingDescriptors:[NSArray arrayWithObject:ageSorter]]; 

// after sort 
NSLog(@"%@",arr); 

Теперь перед сортировать результат будет:

2010-07-21 10:46:31.898 Sorting[70673:207] (
    { 
    age = "28.00"; 
    name = sam; 
}, 
    { 
    age = "100.00"; 
    name = cody; 
}, 
    { 
    age = "299.00"; 
    name = marvin; 
}, 
    { 
    age = "0.0"; 
    name = billy; 
}, 
    { 
    age = "54.00"; 
    name = tammy; 
} 

)

и после сортировки:

2010-07-21 10:46:31.900 Sorting[70673:207] (
    { 
    age = "0.0"; 
    name = billy; 
}, 
    { 
    age = "100.00"; 
    name = cody; 
}, 
    { 
    age = "28.00"; 
    name = sam; 
}, 
    { 
    age = "299.00"; 
    name = marvin; 
}, 
    { 
    age = "54.00"; 
    name = tammy; 
} 

)

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

+0

Почему дону Вы сохраняете возраст как число? [Номер NSNumberWithFloat: 28.0f]; – Gobra

+0

Потому что фактический скрипт im работает с вытягивается с помощью JSON, поэтому он приходит как строковый объект, иначе я бы :) – cdnicoll

ответ

10

Хотя я подвергаю сомнению использование строк здесь, самый простой способ работы с этими данными с быть:

[array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) { 
    NSString *age1 = [item1 objectForKey:@"age"]; 
    NSString *age2 = [item2 objectForKey:@"age"]; 
    return [age1 compare:age2 options:NSNumericSearch]; 
}]; 

Или, используя более поздние особенности индексацию Objective-C в:

[array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) { 
    return [item1[@"age"] compare:item2[@"age"] options:NSNumericSearch]; 
}]; 
+0

Мне пришлось модифицировать это прикосновение, но это сработало, спасибо! – cdnicoll

0

Проще всего хранить возраст как число, а не строку.

+0

См. Мой выше комментарий. Он входит как объект JSON, поэтому я не могу точно сделать его значением int. – cdnicoll

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

  • Нет связанных вопросов^_^