通过NSDictionary的值对NSArray进行排序

5
我正在尝试对一个类似于以下内容的数组进行排序: (请忽略这些人已经远超过任何生存年龄!我只需要大量数字)
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;
}

你可以看到它确实进行了排序,但据我所知,它是按字符串排序的。我尝试过,但在几天的失败尝试后,我仍然无法编写一个能为我进行排序的方法。最好的方法是什么,以便按数值对其进行排序?


为什么不将年龄存储为数字?[NSNumber numberWithFloat:28.0f]; - Gobra
因为我正在使用JSON拉取实际脚本,所以它作为字符串对象出现,否则我会的 :) - cdnicoll
2个回答

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
最简单的方法是将年龄存储为数字而不是字符串。

请看我上面的评论。它以JSON对象的形式出现,所以我无法将其转换为int值。 - cdnicoll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接