поиск элементов из двух массивов CGPoint, содержащих одинаковое значение x

ios arrays swift swift2

70 просмотра

4 ответа

Я знаю, как найти массив, который содержит одинаковые элементы двух массивов, т. Е.

let resultArray = firstArray.filter(secondArray.contains)

Но если оба firstArrayи secondArrayявляются CGPointмассивами, как мне найти элементы, которые содержат одинаковые значения x в обоих?

Автор: OnlyCodeMatters Источник Размещён: 08.11.2019 11:03

Ответы (4)


0 плюса

Решение
let secoundArrayXPoints = secondArray.map{$0.x}
let resultArray = firstArray.filter{ secoundArrayXPoints.contains($0.x) }
Автор: MCMatan Размещён: 20.08.2016 08:35

1 плюс

Если вы не хотите выделять дополнительный CGPointмассив, содержащий xточки secondArray, вы можете использовать следующую альтернативу

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массива промежуточных точек.

Автор: dfri Размещён: 20.08.2016 11:37

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) } )
Автор: tosha Размещён: 20.08.2016 08:42

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) }
Автор: Kubba Размещён: 20.08.2016 08:32
Вопросы из категории :
32x32