我是函数式编程的新手 如果我有2个字符串数组,有没有办法使用map,filter和zip来返回匹配值? 我知道一种肮脏的方法,通过在每个数组中迭代并组合值来查找匹配,但必须有一个干净的方法来做到这一点。
所以var示例我有以下数组:
array1 = [" max"," julie"," helmut"," igor"] array2 = [" sophie"," igor"]
我希望找回" igor"作为一个值
另外一件事,如果不止一场比赛,我的情况下女巫是不可能的,我想知道如何返回一串比赛(仅供我自己理解)
感谢您的帮助:)
答案 0 :(得分:3)
我快速掀起的东西。应该适用于任何符合Equatable的东西(例如字符串):
func getMatches<T: Equatable>(firstArray: [T], secondArray: [T]) -> [T] {
return firstArray.filter({secondArray.contains($0)})
}
或者,这是Kevin's answer
的通用版本func getMatches<T: Equatable>(firstArray: [T], secondArray: [T]) -> Set<T> {
return Set(firstArray).intersect(secondArray)
}
答案 1 :(得分:1)
Set
有一个intersect
方法,它返回集合中存在的值和任何SequenceType
。我不确定这是否是&#34;功能性&#34;但它肯定不是&#34;脏&#34;。
let array1 = ["max","julie","helmut","igor"]
let array2 = ["sophie","igor","helmut"]
let common = Set(array1).intersect(array2)
print(common) //["igor", "helmut"]
答案 2 :(得分:0)
这将适用于您的目的:
let array1 = ["max","julie","helmut","igor"]
let array2 = ["sophie","igor"]
let arrayOfMatches = array1.filter { array2.contains($0) }
print(arrayOfMatches)
如果您需要更多解释,请告诉我 这是撰写此类陈述的最短途径 本质上过滤器需要返回一个布尔值,该布尔值决定是否保持迭代的值。
答案 3 :(得分:0)
答案 4 :(得分:0)
如果您返回值[T]
而不是Set<T>
,请尝试此操作。 (T必须符合可洗)
func getMatches<T: Hashable>(firstArray: [T], secondArray: [T]) -> [T] {
return Array(Set(firstArray).intersect(secondArray))
}