如何比较两个字符串数组并统计其中共同元素的数量?
统计两个字符串数组的共同元素数量
嘿,我来帮你搞定这个问题!你需要统计两个数组里同时出现的元素个数,而且现在还遇到了闭包元组参数的错误,对吧?先给你几个实用的解决方案,再聊聊你可能踩的坑。
方案1:用Set交集(最简洁高效)
如果你的数组里没有重复元素,用Set的intersection方法是最优解——Set的查找效率是O(1),处理大数组时比遍历判断快很多。
let array1 = ["Duck", "Dog", "Cat", "Bird", "Elephant", "Cow", "Goat", "Goose"] let array2 = ["Eagle", "Giraffe", "Cow", "Elephant", "Sheep", "Penguin", "Rhinoceros"] // 把数组转成Set,计算交集后取数量 let set1 = Set(array1) let commonElements = set1.intersection(array2) print(commonElements.count) // 输出2,和预期一致
方案2:用filter + contains(无需转Set)
如果你不想用Set,直接用数组的filter和contains方法也能实现,代码更直观:
let commonCount = array1.filter { array2.contains($0) }.count print(commonCount) // 输出2
关于你遇到的「Closure tuple parameter '(offset: ...'」错误
这个错误大概率是你不小心用了enumerated()方法,但没正确处理它返回的元组((offset: Int, element: String))导致的。举个错误示例:
// 错误写法:用enumerated()后直接把元组传给contains let wrongCount = array1.enumerated().filter { array2.contains($0) }.count // 这里$0是元组,而contains需要字符串类型,所以报错
如果确实需要用到元素的索引(比如业务逻辑需要),你可以解构元组,忽略索引只取元素:
// 正确使用enumerated()的方式 let correctCount = array1.enumerated().filter { _, element in array2.contains(element) }.count
额外补充:处理有重复元素的情况
如果你的数组里有重复元素(比如array1里有2个"Cow",array2里有1个),上面的方法会只算一次。如果需要统计重复元素的实际出现次数(取两个数组中该元素出现次数的最小值之和),可以用字典统计频次:
func countCommonElementsWithDuplicates(_ array1: [String], _ array2: [String]) -> Int { var frequencyDict = [String: Int]() // 统计第一个数组的元素频次 for element in array1 { frequencyDict[element, default: 0] += 1 } var totalCount = 0 // 遍历第二个数组,累加最小频次 for element in array2 { if var freq = frequencyDict[element], freq > 0 { totalCount += 1 freq -= 1 frequencyDict[element] = freq } } return totalCount } // 测试示例 let array1WithDuplicates = ["Cow", "Cow", "Elephant"] let array2WithDuplicates = ["Cow", "Elephant", "Elephant"] print(countCommonElementsWithDuplicates(array1WithDuplicates, array2WithDuplicates)) // 输出2
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

