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