繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM