使用多个NSSortDesciptors有效地对数组中的对象进行排序

时间:2012-07-14 18:46:06

标签: 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数组中设置最小投票数以防止这种情况,但我宁愿不这样做。然后,当我获得更多用户时,我必须更改最小投票数。

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

2 个答案:

答案 0 :(得分:0)

是的,在您的班级中添加一个方法,该方法返回根据平均值和投票数计算的权重。显然,重量的神奇配方取决于你。像avgRating * log2(2 + number_of_votes)之类的东西可能会这样做。然后使用单个排序描述符对此方法进行排序。

答案 1 :(得分:0)

有很多方法可以解决这种情况。

一种方法可能是将投票数量作为衡量评级平均值信心的指标。平均设置为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票100票,比1000票在0到5之间随机散布的票数更多.Dicink。