Tengo un List "a, b, c,d", y este es el resultado esperado

a
ab
abc
abcd
b
bc
bcd
c
cd
d

Probé con fuerza bruta, pero creo que podría haber otra solución eficiente, siempre que tenga una lista muy larga.

0
sailor 24 ene. 2018 a las 09:48

3 respuestas

La mejor respuesta

Puede que esta no sea la mejor solución, pero una forma de hacerlo es mediante la función sliding de la siguiente manera,

val lst = List('a', 'b', 'c', 'd')

val groupedElements = (1 to lst.size).flatMap(x =>
      lst.sliding(x, 1))

groupedElements.foreach(x => println(x.mkString(""))) 

//output
  /*  a
      b
      c
      d
      ab
      bc
      cd
      abc
      bcd
      abcd
      */
1
vindev 24 ene. 2018 a las 07:13

Puede que no sea la mejor solución, pero creo que es una buena, y es tailrec

Primero esta función para obtener las posibles sublistas de un List

 def getSubList[A](lista: Seq[A]): Seq[Seq[A]] = {
      for {
        i <- 1 to lista.length
      } yield lista.take(i)
  }

Y luego este para realizar la recursión llamando a la primera función y obtener todas las sublistas posibles:

def getSubListRecursive[A](lista: Seq[A]): Seq[Seq[A]] = {
    @tailrec
    def go(acc: Seq[Seq[A]], rest: Seq[A]): Seq[Seq[A]] = {
      rest match {
        case Nil => acc
        case l => go(acc = acc ++ getSubList(l), rest= l.tail)
      }
    }
    go(Nil, lista)
  }

La salida:

getSubListRecursive(l)


res4: Seq[Seq[String]] = List(List(a), List(a, b), List(a, b, c), List(a, b, c, d), List(b), List(b, c), List(b, c, d), List(c), List(c, d), List(d))
0
SCouto 24 ene. 2018 a las 07:02

Aquí hay una frase.

"abcd".tails.flatMap(_.inits.toSeq.init.reverse).mkString(",")
//res0: String = a,ab,abc,abcd,b,bc,bcd,c,cd,d

Se agrega mkString() solo para que podamos ver el resultado. De lo contrario, el resultado es un Iterator[String], que es un tipo de colección bastante eficiente en memoria.

reverse solo está allí para que salga en el orden que especificó. Si el orden de los resultados no es importante, eso se puede eliminar.

toSeq.init está ahí para eliminar los elementos vacíos que dejó la llamada inits. Si se pueden tratar en otro lugar, esto también se puede eliminar.

2
jwvh 24 ene. 2018 a las 07:30