2015-03-06 1 views
2

У меня есть общий вопрос о сопоставлении списка scala/spark. Скажем, у меня есть список булевых в виде:scala match из списка Boolean в список sumed Int

List(true, false, false ,true, true) 

Я хочу, чтобы преобразовать этот список булевых к чему-то вроде:

List(1, 1, 1, 2, 3) 

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

+0

yes, add one when true – GameOfThrows

+0

Как это связано с апачей-искрами? – maasg

ответ

5

Вы можете использовать scanLeft для этого:

List(true, false, false, true, true).scanLeft(0) { case (sum, next) => 
    if(next) sum + 1 else sum 
}.tail 

res45: List[Int] = List(1, 1, 1, 2, 3) 

scanLeft позволяет генерировать последовательность частичных сумм , что по сути является тем, что у вас есть здесь. В case (sum, next), sum представляет текущее накопленное значение, а next представляет следующий элемент в List. Таким образом, мы проверяем значение next, и если да, добавьте его, в противном случае верните текущую сумму. Каждый элемент, возвращенный в пределах scanLeft, добавляется к окончательному List.

Обратите внимание, что мне пришлось засеять его 0, который я сбросил в конце, взяв только tailList. В противном случае у меня было бы List(0, 1, 1, 1, 2, 3).

+0

ahhh! Я вижу, спасибо за ваше решение. – GameOfThrows

+1

Я думаю, что 'tail' будет немного понятнее, чем' drop (1) '. – Suma

+0

Я полагаю. Это действительно граница. –

3

Похоже, вы ищете scanLeft:

val bs = List(true, false, false, true, true) 
val is = bs.scanLeft(0){ case (acc, el) => if (el) acc + 1 else acc }.tail 
// "is" is equal to List[Int] = List(1, 1, 1, 2, 3) 

Если взять полный список, а не хвостом, результат List[Int] = List(0, 1, 1, 1, 2, 3) из исходного значения 0.

Вот является scaladoc for scanLeft.

+0

Спасибо за ваше решение, я никогда не использовал scanLeft, часто приходилось разрешать дублирование, удаляя первый/последний и записывая их вместе. Хороший – GameOfThrows

Смежные вопросы