【问题标题】:Effectively sorting objects in an array using multiple NSSortDesciptors使用多个 NSSortDescriptor 有效地对数组中的对象进行排序
【发布时间】:2012-07-14 18:46:05
【问题描述】:

我有一个字典数组。每个字典都保存有关单个音轨的数据。我的应用程序使用星级评分系统,因此用户可以给曲目评分 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 数组中设置最低投票数以防止这种情况发生,但我不想这样做。然后,当我获得更多用户时,我将不得不更改最低投票数。

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

【问题讨论】:

    标签: objective-c ios arrays sorting


    【解决方案1】:

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

    一种方法可能是将投票数视为对评级平均值的置信度的衡量标准。从平均设置为 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 之间更“自信”。我想。

    【讨论】:

    • 这太好了,谢谢。我也在向用户显示avgRating,所以我想我应该显示confidenceRating,以便图表的顺序分别显示。
    【解决方案2】:

    是的,向您的类添加一个方法,该方法返回根据平均投票数和投票数计算得出的权重。显然,重量的神奇公式取决于您。像 avgRating * log2 (2 + number_of_votes) 这样的东西可能会做到这一点。然后使用按此方法排序的单个排序描述符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 2015-09-11
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多