我知道如何找到一個包含兩個數組的相同元素的數組,即,兩個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
點陣列。