Swift中实现字典值出现次数统计的开发问题求助
问题修复方案
原代码存在的问题
- 遍历主题字典时错误遍历了主题名的单个字符,不需要嵌套
for key in topicKeys这层无效循环 - 关键词匹配逻辑错误:原本的
reviews.contains(val)是判断评论数组里有没有完全等于关键词的元素,正确逻辑应该是检查每条评论的文本内容是否包含关键词 - 统计字典赋值时直接强制解包,首次赋值不存在对应key的情况下会直接崩溃
- 最后打印结果时误用
enumerated()方法,会输出数组索引而非主题名称
修复后的完整代码
import Foundation func countOccurance(topics: [String : [String]], reviews: [String]) -> [String : Int] { var count: [String: Int] = [:] // 合并所有评论为整串方便匹配,也可单独遍历每条评论统计 let allReviewContent = reviews.joined() // 遍历每个主题 for (topicName, keywords) in topics { var topicCount = 0 // 遍历当前主题对应的所有关键词 for keyword in keywords { // 检查评论内容是否包含该关键词 if allReviewContent.contains(keyword) { topicCount += 1 } } // 使用默认值避免强制解包崩溃 count[topicName, default: 0] += topicCount } return count } let topics = [ "price" : ["cheap", "expensive", "price"], "business" : ["small", "medium", "large"] ] let reviews = "large company with expensive items. Some are very cheap" let result = countOccurance(topics: topics, reviews: [reviews]) // 正确打印统计结果 for (key,value) in result { print("\(key) : \(value)") }
运行输出
完全符合你要求的预期结果:
price : 2 business : 1
如果需要统计关键词实际出现的总次数(比如同一关键词在评论里出现3次就算3次,而非匹配到就算1次),可以替换为正则匹配统计次数的逻辑即可。
内容的提问来源于stack exchange,提问作者Meri
相关产品推荐
相关产品推荐

