快速找到字符串数组之间的匹配

时间:2016-03-04 00:26:05

标签: arrays swift

我是函数式编程的新手 如果我有2个字符串数组,有没有办法使用map,filter和zip来返回匹配值? 我知道一种肮脏的方法,通过在每个数组中迭代并组合值来查找匹配,但必须有一个干净的方法来做到这一点。

所以var示例我有以下数组:

array1 = [" max"," julie"," helmut"," igor"] array2 = [" sophie"," igor"]

我希望找回" igor"作为一个值

另外一件事,如果不止一场比赛,我的情况下女巫是不可能的,我想知道如何返回一串比赛(仅供我自己理解)

感谢您的帮助:)

5 个答案:

答案 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)

试试这个。

let both = array1.filter{ array2.contains($0) }

enter image description here

答案 4 :(得分:0)

替代PEEJWEEJ's answer.

如果您返回值[T]而不是Set<T>,请尝试此操作。 (T必须符合可洗)

func getMatches<T: Hashable>(firstArray: [T], secondArray: [T]) -> [T] {
    return Array(Set(firstArray).intersect(secondArray))
}