我知道如何找到一个包含两个数组的相同元素的数组,即,两个CGPoint阵列发现的元素,从包含相同的X值
let resultArray = firstArray.filter(secondArray.contains)
但是,如果这两个firstArray
和secondArray
是CGPoint
阵列,我如何找到包含相同x值的元素?
我知道如何找到一个包含两个数组的相同元素的数组,即,两个CGPoint阵列发现的元素,从包含相同的X值
let resultArray = firstArray.filter(secondArray.contains)
但是,如果这两个firstArray
和secondArray
是CGPoint
阵列,我如何找到包含相同x值的元素?
let secoundArrayXPoints = secondArray.map{$0.x}
let resultArray = firstArray.filter{ secoundArrayXPoints.contains($0.x) }
//your data
let search = [CGPoint(x: 0, y: 1), CGPoint(x: 1, y: 1), CGPoint(x: 0, y: 2), CGPoint(x: 3, y: 3)]
let queryPoints = [CGPoint(x: 0, y: 1), CGPoint(x: 1, y: 1)]
//actual search
let queryX = queryPoints.map{ $0.x }
let result = search.filter{ queryX.contains($0.x) }
let arrA: [CGPoint] = [CGPoint(x: 10, y: 10), CGPoint(x:15, y: 20), CGPoint(x: 20, y: 20)]
let arrB: [CGPoint] = [CGPoint(x: 10, y: 30), CGPoint(x:40, y: 20), CGPoint(x: 20, y: 30)]
let arrAx = arrA.map({ $0.x })
let arrC = arrB.filter({arrAx.contains($0.x) })
如果你不想额外拨款CGPoint
列保持的secondArray
的x
点,你可以使用下面这个替代
let resultAlt1 = firstArray
.filter { pt in secondArray.reduce(false) { $0 || $1.x == pt.x } }
这有可能是reduce
的短路并不如明确实施这样做,所以如果性能是一个问题,另一种选择是
let resultAlt2 = firstArray.filter {
for pt in secondArray {
if pt.x == $0.x { return true }
}
return false
}
这在本质上是相同的技术,使用contains
其他的答案,但不需要的中间x
点阵列。