我有一系列词典。每个字典保存有关单个音轨的数据。我的应用程序使用星级评分系统,因此用户可以评分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数组中设置最小投票数以防止这种情况,但我宁愿不这样做。然后,当我获得更多用户时,我必须更改最小投票数。
这有点主观,但有没有人对如何有效地对数组进行排序有任何其他建议?
答案 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。