Вход в систему
РФЭИ/ИТ
Сравнение Практика: обыкновенные дроби Язык программирования Scala
Арифметические операции Итоговый листинг

Сравнение

Между дробями должны быть определены операции алгебраического сравнения, подобные операциям сравнения чисел: ==, !=, <, <=, > и >=.

Равенство экземпляров

Как обсуждалось ранее, методы == и != позволяют сравнивать экземпляры. Чтобы они работали корректно, необходимо переопределить универсальные методы equals и hashCode. Сравнивать экземпляры мы будем по значению поля decimal:

override def equals(obj: Any) = obj match {
  case that: Fraction =>
    this.decimal == that.decimal
  case that: Double =>
    this.decimal == that
  case _ => false
}

override def hashCode = this.decimal.hashCode

Обратите внимание на сопоставление по шаблону, которое используется в методе equals. В данном случае осуществляется сопоставление по типу, который имеет параметр obj.

Также обратите внимание на метод hashCode: поскольку мы осуществляем сравнение по полю decimal, то именно оно используется для получения hashCode.

Операции сравнения

Осталось реализовать четыре операции сравнения: <, <=, > и >=. Реализуем одну из них, а остальные выразим с помощью нее и операции равенства.

def <(that: Fraction) = this.decimal < that.decimal
def <=(that: Fraction) = (this < that) || (this == that)
def >(that: Fraction) = !(this <= that)
def >=(that: Fraction) = !(this < that)

Проверка

val f1 = new Fraction(8,-6)
val f2 = new Fraction(-5,-3)
f1: Fraction = -8/6
f2: Fraction = -5/3
f1 > f2
res0: Boolean = true
f1 <= f2
res0: Boolean = false
f1 == f1.reduced
res0: Boolean = true
Арифметические операции Итоговый листинг
2012 © ООО «Территория Образования»
Сделано с помощью Circumflex