2016-01-29 3 views
1

Я новичок в функциональном программировании, у меня есть Seq [Double], и ​​я бы хотел проверить каждое значение, если оно выше (1), ниже (-1) или равно (0) к предыдущему значению, как:Как сравнить с предыдущими значениями в Seq [Double]

val g = Seq(0.1, 0.3, 0.5, 0.5, 0.5, 0.3) 

и я хотел бы иметь результат, как:

val result = Seq(1, 1, 0, 0, 0, -1) 

есть более краткий путь, чем:

val g = Seq(0.1, 0.3, 0.5, 0.5, 0.5, 0.3) 
g.sliding(2).toList.map(xs => 
if (xs(0)==xs(1)){ 
    0 
} else if(xs(0)>xs(1)){ 
    -1 
} else { 
    1 
} 
) 
+4

Если вы хотите выполнить сжатие, я не уверен, что вы можете бить '(g.tail, g) .zipped.map (_ compare _)'. –

+1

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

+3

Я согласен, что это немного сложнее читать. Замещать что-то против своего хвоста, чтобы получить последовательные пары элементов, является довольно распространенным функциональным идиомом, хотя, поэтому стоит знать. –

ответ

2

compare Использование:

g.sliding(2).map{ case Seq(x, y) => y compare x }.toList 

compare добавляется к черту обогащения называется OrderedProxy

+0

прежде чем я приму свой ответ, вы можете отредактировать => y сравнить x, чтобы иметь результат Я ищу? – user299791

+0

'compare'! У меня была догадка, что-то вроде этого. – Brian

+0

@ user299791: мой плохой, я не обращал достаточного внимания на порядок сравнения. Готово. –

0

Это, по-моему, довольно краткий, но я бы сделал это функцией и передал ее в map, чтобы сделать ее более читаемой. Я использовал сопоставление с образцом и охрану.

//High, low, equal 
scala> def hlo(x: Double, y: Double): Int = y - x match { 
    | case 0.0 => 0 
    | case x if x < 0.0 => -1 
    | case x if x > 0.0 => 1 
    | } 
hlo: (x: Double, y: Double)Int 

scala> g.sliding(2).map(xs => hlo(xs(0), xs(1))).toList 
res9: List[Int] = List(1, 1, 0, 0, -1) 
+0

Улучшение до hlo: 'def hlo (x: Double, y: Double): Int = math.signum (yx) .toInt' – sfosdal

1

Я согласен с Travis Brown's comment сверху, так я предлагаю его в качестве ответа.

Отмена порядка значений в zip, только чтобы соответствовать порядку g. Это имеет дополнительное преимущество использования кортежей вместо последовательности, поэтому не требуется сопоставление шаблонов.

(g, g.tail).zipped.toList.map(t => t._2 compare t._1) 


res0: List[Int] = List(1, 1, 0, 0, -1) 
Смежные вопросы