[英]Effectively sorting objects in an array using multiple NSSortDesciptors
我有很多字典。 每个字典都保存有关单个音轨的数据。 我的应用程序使用星级评分系统,因此用户可以对1-5个星级进行评分。 每个字典每个音轨都有其自己的评分数据,如下所示:
avgRating
(例如:4.6) rating_5_count
(整数,代表该曲目收到多少五星级评分) rating_4_count
rating_3_count
rating_2_count
rating_1_count
我正在尝试在我的应用程序中创建“热门排行榜”表。 我正在使用avgRating
排序的对象创建一个新数组。 我知道如何使用NSSortDescriptors
对对象进行NSSortDescriptors
,但这是我遇到麻烦的地方...
如果我仅将avgRating
用作排序描述符,则如果某条曲目仅获得一个5星级评分,它将跳至图表顶部,并击败了可能获得4.9分并获得数百票的曲目。
我可以设置一个最小投票数,以防止在“ Top Charts”数组中出现这种情况,但是我宁愿不这样做。 然后,随着我获得更多用户,我将不得不更改最低投票数。
这有点主观,但是有人对如何有效地对数组进行排序有其他建议吗?
是的,向您的班级添加一个方法,该方法返回根据平均票数和投票数计算得出的权重。 显然,重量的神奇公式由您决定。 像avgRating * log2(2 + number_of_votes)之类的方法可以做到。 然后,使用单个排序描述符对该方法进行排序。
有很多方法可以处理这种情况。
一种方法可能是将票数视为对平均评分的置信度的度量。 从平均设置为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,当然,您可以更改示例中使用的函数。 平方根也可以工作,或者为什么不能线性发展。 您的来电。
当然,这只是一个例子,非常愚蠢。 票数的标准差可能会在算法中增加一些智能,不仅要考虑票数,还要考虑票数的分布。 5上100的100票比随机散布在0到5之间的1000票具有更多的“信心”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.