koans - scala learn
Convertir un mapa de Scala en una lista (2)
Tengo un mapa que necesito asignar a un tipo diferente, y el resultado debe ser una lista. Tengo dos formas (aparentemente) de lograr lo que quiero, ya que llamar al mapa en un mapa parece dar como resultado siempre un mapa. Suponiendo que tengo un mapa que se parece a:
val input = Map[String, List[Int]]("rk1" -> List(1,2,3), "rk2" -> List(4,5,6))
Puedo hacerlo:
val output = input.map{ case(k,v) => (k.getBytes, v) } toList
O:
val output = input.foldRight(List[Pair[Array[Byte], List[Int]]]()){ (el, res) =>
(el._1.getBytes, el._2) :: res
}
En el primer ejemplo, convierto el tipo, y luego llamo a List. Supongo que el tiempo de ejecución es algo así como O(n*2)
y el espacio requerido es n*2
. En el segundo ejemplo, convierto el tipo y genero la lista de una vez. Supongo que el tiempo de ejecución es O(n)
y el espacio requerido es n
.
Mi pregunta es, ¿son esencialmente idénticos o la segunda conversión reduce la memoria / tiempo / etc.? Además, ¿dónde puedo encontrar información sobre el almacenamiento y los costos de tiempo de ejecución de varias conversiones de scala?
Gracias por adelantado.
La asignación sobre una vista en el primer ejemplo podría reducir el requisito de espacio para un mapa grande:
val output = input.view.map{ case(k,v) => (k.getBytes, v) } toList
Mi forma favorita de hacer este tipo de cosas es así:
input.map { case (k,v) => (k.getBytes, v) }(collection.breakOut): List[(Array[Byte], List[Int])]
Con esta sintaxis, está pasando para map
el constructor que necesita para reconstruir la colección resultante. (En realidad, no es un constructor, sino una fábrica de constructores. Obtenga más información acerca de CanBuildFrom
s de Scala si está interesado). CanBuildFrom
se puede usar exactamente cuando desee cambiar de un tipo de colección a otro mientras se hace un map
, flatMap
, etc. .-La única parte mala es que tienes que usar la anotación de tipo completo para que sea efectiva (aquí, utilicé una adscripción de tipo después de la expresión). Entonces, no se está construyendo una colección intermediaria, y la lista se construye durante el mapeo.