objective-c - 按 NSDictionary 值对 NSArray 进行排序

标签 objective-c sorting 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;
}

)

如您所见,它确实对其进行了排序,但根据我的理解,它是按字符串排序的。我已经尝试过了,但是在尝试编写一种可以为我排序的方法失败了几天之后,我仍然不知所措。实现此目的的最佳方法是什么,以便按数值排序?

最佳答案

虽然我在这里质疑字符串的使用,但使用该数据的最简单方法是:

[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];
}];

关于objective-c - 按 NSDictionary 值对 NSArray 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3302222/

相关文章:

iphone - UITextView - 如何定义一个单词是一行中的最后一个单词

javascript - 是否有任何解决方法可以使 Chrome 正确排序?

objective-c - iOS:替换数组数组中的对象

ios - Swift - 数组过滤器,然后更新主数组

ios - TabBar 图像的大小应该是多少?

ios - iOS8下CGAffineTransform Make Rotation和Auto Layout问题

c++ - 对输入的名称 'age' 进行排序,然后显示结果

java - 比较方法: Object arg?

iphone - 委托(delegate)的非保留数组

ios - 为什么图像拉伸(stretch)(UIImage 到 CIImage 到 UIImage)