Построение прямоугольника в Scala - PullRequest
0 голосов
/ 04 октября 2019

Я новичок в Scala и пытаюсь понять классы и методы кейсов с помощью следующего упражнения. Буду признателен за любые материалы или помощь, так как я все еще привыкаю к ​​синтаксису.

До сих пор я предпринял следующие шаги:

a) Создайте класс case с именем Point () состоит из двух целых чисел, x и y

b) Создайте методы leftOf () и выше () , чтобы выяснить, осталась ли данная точка от /над другой точкой

#part a
case class Point(x: Integer, y: Integer) {
#part b
def leftOf(point: Point): Boolean = {
if(x < point.x) return true}
def above(point: Point): Boolean = {
if(y > point.y) return true}
}

c) Создайте прямоугольник класса дел, построенный из двух точек: a topLeft и bottomRight

d) Создайте еще одинметод с именем содержит () , который принимает точку p и возвращает значение true, если точка внутри прямоугольника

e) Создает другой метод с именем overlaps () , который принимает одинпрямоугольник r и возвращает истину, если он перекрывается другим прямоугольником

#part c
case class Rectangle(topLeft: Point, bottomRight: Point) {
val topLeft: Point = leftOf.x && above.y
val bottomRight: Point = !(leftOf.x && above.y)
val bottomLeft: Point = topLeft.x && bottomRight.y
val topRight: Point = bottomRight.x && topLeft.y

#part d
def contains(p: Point): Boolean = {
if (p.topLeft.x < x < p.bottomRight.x) && (p.topLeft.y < y < p.bottomRight.y) return true}

#part e
def overlaps(r1: Rectangle, r2: Rectangle): Boolean = {
if (r2.topLeft(r1) || r2.topRight(r1) || r2.bottomLeft(r1) || r2.bottomRight(r1)) return true}

1 Ответ

3 голосов
/ 04 октября 2019

Вот реализация первых 4 требований в качестве попытки показать, как писать идиоматический Scala код.
Последнее требование оставлено в качестве упражнения для читателя.

// Part a.
final case class Point(x: Int, y: Int) {
  // Part b.
  def isLeftOf(that: Point): Boolean =
    this.x < that.x

  def isAboveOf(that: Point): Boolean =
    this.y > that.y

  def isRightOf(that: Point): Boolean =
    !isLeftOf(that)

  def isBelowOf(that: Point): Boolean =
    !isAboveOf(that)
}

// Part c.
final case class Rectangle(topLeft: Point, bottomRight: Point) {
  // Part d.
  def contains(point: Point): Boolean =
    (point isBelowOf this.topLeft) &&
    (point isRightOf this.topLeft) &&
    (point isAboveOf this.bottomRight) &&
    (point isLeftOf this.bottomRight)
}

Rectangle(Point(0, 0), Point(5, 5)) contains Point(3, 3)
// res: Boolean = true

_ ( Примечание: Это решение содержит некоторые ошибки, касающиеся реализации isRightOf & isBelowOf (транзитивно, contains тоже) . Его решение осталосьв качестве упражнения для читателя) _.

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