objective-c - 使用多个 NSSortDescriptor 有效地对数组中的对象进行排序

标签 objective-c ios arrays sorting

我有一系列字典。每个字典都保存有关单个音轨的数据。我的应用程序使用星级评分系统,因此用户可以给轨道评分 1-5 星。每个字典的每个音轨都有自己的评分数据,如下所示:

  • avgRating (例如:4.6)
  • rating_5_count (整数表示一首轨道获得了多少 5 星评级)
  • rating_4_count
  • rating_3_count
  • rating_2_count
  • rating_1_count

  • 我正在尝试在我的应用程序中创建一个 Top Charts 表。我正在创建一个新数组,其中的对象按 avgRating 排序.我了解如何使用 NSSortDescriptors 对对象进行排序,但这是我遇到麻烦的地方......

    如果我只使用 avgRating作为排序描述符,如果一首轨道仅获得一个 5 星评级,它将跳到排行榜的顶部,并以数百票击败可能有 4.9 星的轨道。

    我可以在 Top Charts 数组中设置最低投票数以防止这种情况发生,但我宁愿不这样做。然后,当我获得更多用户时,我将不得不更改最低投票数。

    这有点主观,但是有人对如何有效地对数组进行排序有任何其他建议吗?

    最佳答案

    有很多方法可以处理这种情况。

    一种方法可能是将投票数视为对评级平均值的置信度的衡量标准。从平均设置为 3 开始(每个示例)。

    const double baseConfidenceRating = 3;
    NSUInteger averageRating = ...;
    NSUInteger voteCount = ...;
    
    const NSUInteger baseConfidence = log10( 1000 );
    double confidence = log10( 1 + voteCount ) / baseConfidence;
    double confidenceWeight = fmin( confidence, 1.0 );
    
    double confidenceRating = (1.0 - confidenceWeight) * baseConfidenceRating + confidenceWeight * averageRating;
    

    现在根据 confidenceRating 对数组进行排序而不是 averageRating .

    您可以通过更改需要多少票来调整上面的算法,使 confidenceRating 等于 averageRating,当然,您可以更改我在示例中使用的函数。平方根也可以工作,或者为什么不是线性进展。你的来电。

    当然,这只是一个例子,一个非常愚蠢的例子。投票的标准差可能会在算法中增加一些智能,不仅要考虑投票的数量,还要考虑投票的分布。 100 票对 100 票 5 比 1000 票随机散布在 0 和 5 之间更“自信”。我想。

    关于objective-c - 使用多个 NSSortDescriptor 有效地对数组中的对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11486416/

    相关文章:

    objective-c - iOS如何构建ffmpeg

    ios - 推送和弹出 VC 后,UITableViewCell selectedBackgroundView 保持按下状态

    php - 如何在 PHP 中将数组转换为对象?

    ios - 如何在同一 View 中使用两个iAd View 来回切换?

    ios - 将 Objective-C block 声明为变量的最佳实践

    ios - 适用于 iPad 的 SSRS 报表查看器

    arrays - 从列中分块对角矩阵

    python - 根据多列的条件选择行

    ios - 拦截电话 - iPhone(挂接 CoreTelephony 的正确方法)

    Objective-C ARC 已在 PCH 文件中启用,但当前已禁用 - 错误