Как сопоставить две структуры с вложенными циклами? - PullRequest
0 голосов
/ 24 января 2019

У меня есть две структуры; 'pointsArray' типа (Double, Double) и 'listOfBBs' класса типа List [BoundingBox]. Я хочу сопоставить каждую точку одному BoundingBox. Это код, который я пытаюсь, он запускается, но выдает пустой список '()'.

var PointsMappedtoGrids1 = Map[(Double,Double),BoundingBox] ()
for (point <- pointsArray)
{for{eachBB <-listOfBBs
  if point._1 >= eachBB.lowerleft._1 &&
    point._1 <= eachBB.upperright._1 &&
    point._2 >= eachBB.lowerleft._2 &&
    point._2 <= eachBB.upperright._2}
  PointsMappedtoGrids1 + (point->eachBB)}

Пожалуйста, направьте или намекните, что я должен сделать, чтобы получить отображение всех точек с их соответствующими ячейками. Спасибо.

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Я думаю, это то, что вы ищете:

Предполагается, что BoundingBox является классом дела, а структура является следующей:

case class BoundingBox(lowerLeft: (Double, Double), lowerRight: (Double, Double), upperLeft: (Double, Double),
                         upperRight: (Double, Double))

  val pointArray: Array[(Double, Double)] = Array((1, 2), (2, 1), (3, 3), (4, 8), (5, 6))

val listOfBBs = List(BoundingBox((1, 2), (2, 3), (4, 5), (6, 7)))

  val x: Array[Map[(Double, Double), BoundingBox]] =for {
    point <- pointArray
    eachBB <- listOfBBs

    if point._1 >= eachBB.lowerLeft._1 &&
      point._1 <= eachBB.upperRight._1 &&
      point._2 >= eachBB.lowerLeft._2 &&
      point._2 <= eachBB.upperRight._2
  } yield PointsMappedtoGrids1 + (point -> eachBB)
0 голосов
/ 24 января 2019

Вот более функциональная версия логики:

val PointsMappedtoGrids1: Map[(Double,Double),BoundingBox] =
  (for {
    point <- pointsArray
    bb <- listOfBBs
    if point._1 >= bb.lowerleft._1 &&
       point._1 <= bb.upperright._1 &&
       point._2 >= bb.lowerleft._2 &&
       point._2 <= bb.upperright._2
  } yield point -> bb
  )(collection.breakOut)

Это создает Map за один проход и избегает использования var или изменяемых данных.

0 голосов
/ 24 января 2019

Если вы не хотите вносить большие изменения, вы можете попробовать PointsMappedtoGrids1 = PointsMappedtoGrids1 + (point-> eachBB) вместо использования PointsMappedtoGrids1 + (point-> eachBB), но гораздо лучше, если вы просто используете map, потому что nested for loops вернет Unit тип данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...