按 NSDictionary 值对 NSArray 进行排序

Posted

技术标签:

【中文标题】按 NSDictionary 值对 NSArray 进行排序【英文标题】:Sorting an NSArray by an NSDictionary value 【发布时间】:2010-07-21 17:50:12 【问题描述】:

我正在尝试对一个看起来像这样的数组进行排序: (请忽略这些人已经过了任何年龄的事实!我只需要大量的人)

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]; 因为我正在使用的实际脚本是使用 JSON 提取的,所以它作为字符串对象出现,否则我会:) 【参考方案1】:

尽管我在这里质疑字符串的使用,但使用 be 处理该数据的最简单方法是:

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

【讨论】:

【参考方案2】:

最简单的方法是将年龄存储为数字而不是字符串。

【讨论】:

见我上面的评论。它以 JSON 对象的形式出现,因此我无法将其完全设为 int 值。

以上是关于按 NSDictionary 值对 NSArray 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中对 NSDictionary 对象的 NSArray 进行排序

按 2 级深的键值关系对 NSArray 进行排序

使用 NSDictionary 按 int 值过滤 NSArray

使用 NSDictionary 对 NSArray 进行排序

从 NSDictionaries 数组中获取键/值对

nsdictionary 上的排序给出的结果与 nsarray 上的排序不同