Перебрать scala Vector и соединить определенный объект со следующим.

Предполагая, что у меня есть коллекция (Vector[Int]),1,2,5,4,3,5,5,5,6,7,7 и я хочу получить другую коллекцию (Vector[Vector[Int]]), соединяющую каждое число 5 со следующим числом (1),(2),(5,4),(3),(5,5),(5,6),(7),(7), какие у меня есть варианты, кроме этого:

var input= Vector.[Int]
var output = Vector.empty[Vector[Int]]
var skip = false

  for(i <- input.indices){
    if (input(i) == 5 && skip == false){
      output = output :+ input(i) :+ input(i + 1)
      skip = true;
    }else if(input(i - 1) != 5){
      output = output :+ input(i)
    }else{
      skip = false;
    }
  }

который работает, но не очень похож на scala. Можно ли было бы добиться того же результата с помощью для понимания? for(x ‹- c; if cond) yield {...}


person PaulB    schedule 30.04.2017    source источник


Ответы (2)


Вы можете использовать foldLeft

val output = input.foldLeft (Vector.empty[Vector[Int]]) { (result, next) =>
    if(!result.isEmpty && result.last == Vector(5)) {
        result.dropRight(1) :+ Vector(5, next)
    } else {
      result :+ Vector(next)
    }
}
person SpiderPig    schedule 30.04.2017

Вы также можете использовать сопоставление с образцом

   def prepareVector(lv: Vector[Int]): Vector[Vector[Int]] = {
     val mv = new ArrayBuffer[Vector[Int]]()

     def go(ll: List[Int]): Unit = ll match {
       case y :: Nil => mv += Vector(y)
       case 5 :: ys => {
         mv += Vector(5, ys.head)
         go(ys.tail)
       }
       case y :: ys => {
         mv += Vector(y)
         go(ys)
       }
       case Nil => None
     }

     go(lv.toList)

     mv.toVector
   }
person Utsav    schedule 30.04.2017