2016-08-20 32 views
1

我知道如何找到一個包含兩個數組的相同元素的數組,即,兩個CGPoint陣列發現的元素,從包含相同的X值

let resultArray = firstArray.filter(secondArray.contains) 

但是,如果這兩個firstArraysecondArrayCGPoint陣列,我如何找到包含相同x值的元素?

回答

0
let secoundArrayXPoints = secondArray.map{$0.x} 
let resultArray = firstArray.filter{ secoundArrayXPoints.contains($0.x) } 
0
//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) } 
0
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) }) 
1

如果你不想額外撥款CGPoint列保持的secondArrayx點,你可以使用下面這個替代

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點陣列。