我有一个包含多个 NSDictionary 实例的 NSArray 。除其他字段外,每个 NSDictionary
都有一个名为 rating
的对象和一个 numberOfVotes
(两者都是 int
)。如何对数组进行排序,以便按 rating
/numberOfVotes
排序?更一般地说,我可以通过执行如上所述的操作对其进行排序吗?或者直接将另一个对象添加到每个 NSDictionary
中并包含每个操作的值,然后按该值排序会更好吗?
谢谢
编辑 - 我添加了以下内容。仍然没有正确排序。一个问题:这是否适用于我的数组中超过 2 个对象。 (对象的数量会有所不同)
[sortedArray sortedArrayUsingComparator:^NSComparisonResult(id dict1, id dict2)
{
MyObj *obj1 = (MyObj *)dict1;
MyObj *obj2 = (MyObj *)dict2;
int rating1 = obj1.rating.intValue;
int rating2 = obj2.rating.intValue;
int number1 = obj1.number_of_votes.intValue;
int number2 = obj2.number_of_votes.intValue;
double key1 = ((double)rating1)/number1;
double key2 = ((double)rating2)/number2;
if (key1 < key2)
{
return NSOrderedDescending;
}
if (key2 < key1)
{
return NSOrderedAscending;
}
return NSOrderedSame;
}];
最佳答案
您可以定义自定义比较器来使用您正在寻找的复合排序键。如果没有充分的理由在字典中包含该排序键,除了执行排序之外,请勿将项目添加到字典中。
array = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
int rating1 = [[obj1 objectForKey:@"rating"] intValue];
int numberOfVotes1 = [[obj1 objectForKey:@"numberOfVotes"] intValue];
int rating2 = [[obj2 objectForKey:@"rating"] intValue];
int numberOfVotes2 = [[obj2 objectForKey:@"numberOfVotes"] intValue];
double key1 = ((double)rating1)/numberOfVotes1;
double key2 = ((double)rating2)/numberOfVotes2;
if (key1 > key2) {
return (NSComparisonResult)NSOrderedDescending;
}
if (key1 < key2) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
注意:sortedArrayUsingComparator:
方法不会对数组进行就地排序;相反,它返回一个排序的副本。如果您想要就地排序,请使用 NSMutableArray
。
关于objective-c - NSArray 按函数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13140967/