objective-c - NSArray 按函数排序

标签 objective-c nsarray sorting

我有一个包含多个 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/

相关文章:

ios - UIImages/UIButtons 每次编译程序时表现不同

objective-c - NSTimer 没有运行选择器?

objective-c - 检查 NSString 是否存在于 NSArray 中的自定义对象中

ios - 如何知道 UIVIewController 是否显示为 Peek Preview Controller

iPhone - NSDictionary 到 NSArray 并保留顺序

ios - NSArray 中的 NSObjects 的属性是否发生变化,或者它们是否必须再次添加到 NSArray?

java - ArrayList<BigInteger> 排序算法 Java

c++ - 使用 stable_sort() 将 double 排序为整数

php - 如何按计数或其他表中的某些条件排序

ios - 排序 NSArray 的 NSDictionaries 忽略大小写