Objective c 按函数排序的NSArray
我有一个Objective c 按函数排序的NSArray,objective-c,nsarray,sorting,Objective C,Nsarray,Sorting,我有一个NSArray包含几个NSDictionary实例。除其他字段外,每个NSDictionary都有一个名为rating的对象和一个numberofdrives(两者都是int)。如何对数组进行排序,使其按评级/投票数排序?更一般地说,我可以通过执行上面提到的操作对其进行排序吗?或者只需向每个NSDictionary中添加另一个对象,并使用每个操作的值,然后按该值排序,会更好吗 谢谢 编辑-我添加了以下内容。仍然没有正确分类。一个问题:这是否适用于数组中的两个以上对象。(对象的数量将有所不
NSArray
包含几个NSDictionary
实例。除其他字段外,每个NSDictionary
都有一个名为rating
的对象和一个numberofdrives
(两者都是int
)。如何对数组进行排序,使其按评级
/投票数
排序?更一般地说,我可以通过执行上面提到的操作对其进行排序吗?或者只需向每个NSDictionary
中添加另一个对象,并使用每个操作的值,然后按该值排序,会更好吗
谢谢
编辑-我添加了以下内容。仍然没有正确分类。一个问题:这是否适用于数组中的两个以上对象。(对象的数量将有所不同)
[sortedArray sortedArray使用比较器:^n比较结果(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\u of_voces.intValue;
int number2=obj2.number\u of_voces.intValue;
双按键1=((双)额定值1)/number1;
双按键2=((双)额定值2)/number2;
如果(键1<键2)
{
退而求其次;
}
如果(键2<键1)
{
回报率下降;
}
返回指定名称;
}];
您寻找的方法系列的前缀是sortedArray
有关函数(多个选项之一),请参见:-[NSArray sortedArrayUsingFunction:context:
编辑:如果要进行评级
除以投票数
,您必须按函数或比较器块进行排序,或用模型对象替换字典,该模型对象具有计算评级/numberofdrives
的方法
使用
您可以定义一个自定义比较器,以使用所需类型的复合排序键。如果没有充分的理由在字典中包含排序键,除了执行排序外,不要向字典中添加项
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;
}];
array=[array sortedarrayingcomparator:^(id obj1,id obj2){
整数评级1=[[obj1 objectForKey:@“评级”]intValue];
int numberOfVotes1=[[obj1 objectForKey:@“numberOfVotes”]intValue];
int rating2=[[obj2 objectForKey:@“rating”]intValue];
int numberOfVotes2=[[obj2 objectForKey:@“numberOfVotes”]intValue];
双按键1=((双)额定值1)/numberOfVotes1;
双按键2=((双)额定值2)/numberOfVotes2;
如果(键1>键2){
返回(NSComparisonResult)或撤销;
}
如果(键1<键2){
返回(NSComparisonResult)或删除;
}
返回(NSComparisonResult)命令名;
}];
注意:使用比较器的
sortedarray:
方法未对数组进行适当排序;相反,它返回一个已排序的副本。如果需要就地排序,请使用NSMutableArray
适当的方法是使用这样的块
NSArray *sortedArray;
sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
float first = [[(NSDictionary*)a objectForKey:@"rating"] floatValue]/
[[(NSDictionary*)a objectForKey:@"numberOfVotes"] floatValue];
float second = [[(NSDictionary*)a objectForKey:@"rating"] floatValue]/
[[(NSDictionary*)a objectForKey:@"numberOfVotes"] floatValue];
return [[NSNumber numberWithFloat:first] compare: [NSNumber numberWithFloat:second]];
}];
您可以找到更多方法进行比较:
过滤数据是计算中的基本任务之一 你可以用几种方法来分类
理想情况下,您应该用自定义对象替换
NSDictionary
,并使用rating
和numberofvoces
等属性。然后,您可以在此自定义对象上声明一个方法compare:
,并将其用作对数组排序的选择器
您可以使用块代码对对象进行排序,但将实现抽象为自定义对象要干净得多。您可以在此处使用NSSortDescriptor进行排序,例如,包含多个NSDictionnaries名称的数组是dataArray
NSSortDescriptor * descriptor = [[NSSortDescriptor alloc] initWithKey:rating
ascending:YES];
NSArray * keyArrray = [NSArray arrayWithObjects:descriptor, nil];
NSArray * sortedArray = [dataArray sortedArrayUsingDescriptors:keyArrray];
在NSSortDescriptor的帮助下,我们可以对任何数据类型的键值对进行排序。看起来OP希望将
评级
除以投票数
,而不是通过投票数
解决冲突。啊。然后OP必须使用比较器/函数(请参见@dasblinkenlight)或从字典到模型对象,并定义一个方法来计算适当的排序依据值。@Andreiflip Yes,这将适用于所需的任意多个项目。但是,这不会对阵列进行适当的排序;它返回数组的一个排序副本。这太棒了,因为它使用块,ftw!!;-)
NSArray *sortedArray;
sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
float first = [[(NSDictionary*)a objectForKey:@"rating"] floatValue]/
[[(NSDictionary*)a objectForKey:@"numberOfVotes"] floatValue];
float second = [[(NSDictionary*)a objectForKey:@"rating"] floatValue]/
[[(NSDictionary*)a objectForKey:@"numberOfVotes"] floatValue];
return [[NSNumber numberWithFloat:first] compare: [NSNumber numberWithFloat:second]];
}];
NSSortDescriptor * descriptor = [[NSSortDescriptor alloc] initWithKey:rating
ascending:YES];
NSArray * keyArrray = [NSArray arrayWithObjects:descriptor, nil];
NSArray * sortedArray = [dataArray sortedArrayUsingDescriptors:keyArrray];