2014-10-29 5 views
4

Я пытаюсь рассчитать соотношение сторон java.awt.Rectangle в Scala. Я перехожу к соотношению «более длинной стороны к более короткой стороне» «определение пропорции, а не отношение ширины к высоте».Упрощение коэффициента вычисления выражения Scala

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

val sizes = Seq(rect.getWidth, rect.getHeight) 
val aspectRatio = sizes.max/sizes.min 

ответ

8

подход, предполагая, что только два значения добавляются в последовательности,

Seq(rect.getWidth, rect.getHeight).sorted.reverse.foldRight(1.0)(_/_) 

Код, который вы предлагаете, более читаемым, хотя, и менее склонны к ошибкам, в основном деление на ноль потребуется некоторое забота.

+3

Создание последовательности и выполнение 3 операций в ней - слишком сложное решение для такой простой задачи. – rtruszk

5
val aspectRatio = if(rect.getWidth >= rect.getHeight) rect.getWidth/rect.getHeight else rect.getHeight/rect.getWidth 
+0

+1 для просто проведения сравнения один раз. – Andreas

+0

Правильно отформатирован. Посмотрите последний параграф руководства по стилю: http://docs.scala-lang.org/style/control-structures.html, «Тривиальные условия». Кроме того, это действительно тривиальная задача. Я не вижу причин, по которым мы должны использовать что-то большее, чем если бы здесь. – makingthematrix

18

Вам не нужно создавать последовательность для вычисления минимальных и максимальных значений. Вы можете использовать математические методы вместо

Math.max(rect.getWidth, rect.getHeight)/Math.min(rect.getWidth, rect.getHeight) 
Смежные вопросы