【问题标题】:Fetch parse table data in dictionary, filter and do math operation获取字典中的解析表数据,过滤并进行数学运算
【发布时间】:2015-04-27 11:39:22
【问题描述】:

我是独立开发人员,几个月前开始学习编程。目前我正在尝试找到一种方法来获得业务评级并在需要时将其显示给用户。我使用 Parse.com 作为我的后端,并拥有具有以下列(键)的解析表:

评级(类型:数字) - 使用浮点值

企业名称(类型:字符串)

BusinessReviewText(类型:字符串)

现在,我将这些数据检索为:

//Declaring empty dictionary
    var businessReview = [[String:Float]]()
    var businessReviewText = [[String:String]]()

//Parse query
 var query: PFQuery = PFQuery(className: "Business")
        query.whereKey("ratingBool", equalTo: true) // just checking which businesses have been reviewed by users
        query.findObjectsInBackgroundWithBlock{(objects:[AnyObject]?, error: NSError?) -> Void in
            if (error == nil) {
                for object in objects as! [PFObject!]{

                    var bN:AnyObject = object["BusinessName"]!
                    var bR: AnyObject = object["Rating"]!
                    var bRT: AnyObject = object["BusinessReviewText"]!

                    self.businessName.addObject(bN)
                    self.businessRating.addObject(bR)
                    self.businessRatingText.addObject(bRT)   
                    self.businessReview.append(["\(bN)":bR as! Float])
                    self.businessReviewText.append(["\(bN)":"\(bRT)"])
                }
// Gives me Key: BusinessName and its rating value: floatValue as output
                println("\(self.businessReview)") // I get the output as [[businessA: 4.0], [businessA: 4.0], [businessB: 5.0], [businessC: 5.0], [businessC: 3.5], [businessC: 3.5], [businessD: 3.5]]

// Gives me Key:BusinessName and its review Value:ReviewText as output
                println("\(self.businessReviewText)") // I get the output as [[businessA: Good job], [businessA: High], [businessC: Awesome service! A++], [businessC: Good service!], [businessC: Good but can improve], [businessD: "NO REVIEW"], [businessD: Ok ]]
            }
        }
    }

现在我有以下问题: 1. 我现在如何用它的键值过滤每个企业名称,以便我可以进行数学运算,例如, 要获得 businessC 的评级:(添加所有 businessC 评级/businessC.count),即:((5+3.5+3.5)/3) = 4

注意:在这里,我不知道用户正在查看哪些商家评分(例如:用户可以搜索中餐馆,他可以看到所有中餐馆商家评分的评分)。因此,我希望在一个结果中审查所有业务(这样做是否正确?)

  1. 这是获得评级的正确方法吗?如果没有,有什么替代方案?有教程吗?

对不起,如果我的描述性太强。但是在搜索堆栈溢出时,我有时会发现很难理解人们提出的问题。所以我尽量提供尽可能多的信息。

提前致谢。

【问题讨论】:

  • "用它的键值过滤每个企业名称" 您要过滤企业的实际名称吗?或按企业名称过滤?你能包括一个例子吗?谢谢!
  • 如果以上内容不清楚,请见谅。但我不知道用户在屏幕上的特定键值。这就是我说我希望代码计算所有业务的评论的原因。因此,用户在屏幕上查看的业务无关紧要。他可以看到最终输出,例如:名称:businessA,评分:5(在计算平均评分后的总体)和业务评论文本(如果他单击特定业务)。类似于 eBay/Amazon 以及您看到的所有其他地方的评论。
  • 你可以创建两个 NSDictionary。第一个是 NSString 类型的键和 NSArray 类型的值(例如 Key:BusinessName、Value:Array of Ratings)。第二个是 NSString 类型的键和 Integer 类型的值(例如 Key:BusinessName、Value:Average Rating)。然后,在对企业进行迭代时,将评级插入到与第一个字典中的 businessName 键对应的数组中。接下来,枚举第一个字典,并在值中迭代数组中的对象。最后,平均该特定业务的评分并插入平均值...
  • 进入对应于businessName键的第二个字典。现在你有一个 businessNames 字典,它们的值是平均值。您的问题可以通过多种方式解决,但这只是值得深思的问题,我认为时间复杂度仅为 O(n + n)=O(2n)=O(n)。
  • @Jonathan,我还在学习。我使用过数组,但这是我第一次真正使用字典。枚举我将不得不首先研究它是什么。您能否提供上面提到的代码示例?一旦我能够让它工作,我会接受答案。谢谢。

标签: ios swift parse-platform


【解决方案1】:

您可以创建两个 NSDictionary。第一个是 NSString 类型的键和 NSArray 类型的值(例如 Key:BusinessName、Value:Array of Ratings)。第二个是 NSString 类型的键和 Integer 类型的值(例如 Key:BusinessName、Value:Average Rating)。然后,在对企业进行迭代时,将评级插入到与第一个字典中的 businessName 键对应的数组中。接下来,迭代第一个字典中的键,并在值中迭代数组中的对象。最后,对特定业务的评分进行平均,并将平均值插入与 businessName 键对应的第二个字典中。现在您有一个业务名称字典,它们的值是平均值。

您的问题可以通过多种方式解决,但这只是值得思考的问题。这个网站上的人也许可以给你一个更有效的方法。

伪代码:

Dictionary[String, Array] allRatings
Dictionary[String, Integer] averageRatings

for each business
    if allRatings does not contain business.name
        Array ratings
        ratings add business.rating
        allRatings set key equal to business.name and set value equal to ratings
    else
        Array ratings = allRatings get array for bussiness.name
        ratings add business.rating
end for each

for each key called businessName in allRatings
    Array ratings = allRatings get value for businessName

    int average = 0

    for each rating in ratings
        average += rating
    end for each

    average /= ratings.count

    averageRatings set key equal to businessName and set value equal to average
end for each

理论上,我认为这个时间复杂度应该是 O(n^2)。不错,但不是很好。

附注我觉得这可能有问题,但除非我测试过,否则我无法确定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多