es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cambio de valor de una lista antes de ser devuelta – scala.

clase test{
import io.Source
import scala.util._

val pathname = "XXXYYY.csv"
val open = Source.fromFile(pathname).getLines

def agregarElementos(lista: List[String]) : List[String] = {

def agregarElementosRecursividad(lista: List[String]) : List[String] = {

    while(open.hasNext){
        val tmpVal = open.next()
        val nuevaLista = lista:+tmpVal
        agregarElementosRecursividad(nuevaLista) 
    }

    println(lista)

    lista
}


agregarElementosRecursividad(lista)

}

}

val obj = new test()
val lista1 = List()
obj.agregarElementos(lista1)

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la que el resultado final no es List(1,2) es porque el bucle while en la función addElementsRecursion está reemplazando open con la próxima línea cada vez que se llama. Entonces, cuando llega al final del archivo y el bucle while se sale, open ya está al final del archivo y llamar open.hasNext nuevamente devolverá falso, pero open.next() seguirá devolviendo un valor (una cadena vacía en este caso) y tmpVal se agregará a list antes de imprimirlo. Por eso la salida es List(1, 2), List(1), List().

    Para solucionar esto, puedes mover la inicialización de open dentro de la función addElementsRecursion para que se llame cada vez que la función se llame recursivamente. Esto reiniciará open al principio del archivo cada vez y evitará el problema de obtener una cadena vacía cuando se llame a open.next() al final del archivo. Aquí tienes el código modificado:

    class test {
      import io.Source
      import scala.util._
    
      val pathname = "XXXYYY.csv"
    
      def addelements(list: List[String]): List[String] = {
        def addElementsRecursion(list: List[String], open: Iterator[String]): List[String] = {
          if (open.hasNext) {
            val tmpVal = open.next()
            val newList = list :+ tmpVal
            addElementsRecursion(newList, open)
          } else {
            println(list)
            list
          }
        }
    
        val open = Source.fromFile(pathname).getLines
        addElementsRecursion(list, open)
      }
    }
    
    val obj = new test()
    val list1 = List()
    obj.addelements(list1)
    

    Con esta modificación, la salida será List(1, 2) como se espera.

Comments are closed.