2016-08-20 89 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点阵列。