recorrer - Char o cadena-> valor Unicode en Scala?
string['' fromcharcode ''] (7)
Aquí hay otra forma:
scala> (for (c <- "Hello") yield c.toLong).product
res36: Long = 9415087488
Así que estoy trabajando en algunos de los ejercicios de "Scala para el impaciente" y uno de ellos es:
Escriba un bucle for para calcular el producto de los códigos Unicode de todas las letras en una cadena. Por ejemplo, el producto de los personajes en "Hola" es 9415087488 L.
El siguiente problema es hacer lo mismo, pero sin un bucle for
: sugiere que deberíamos verificar StringOps
en Scaladoc.
Comprobé la sección RichChar
y StringOps
en Scaladoc, y tal vez estoy malinterpretando o buscando en los lugares equivocados, pero no puedo encontrar nada que me permita hacer coincidir sus resultados. Hasta ahora he intentado:
scala> x.foldLeft(1)(_ * _.toInt)
res0: Int = 825152896
scala> x.foldLeft(1)(_ * _.getNumericValue)
res5: Int = 2518992
scala> x.foldLeft(1)(_ * _.intValue())
res6: Int = 825152896
scala> var x = 1
x: Int = 1
scala> for (c <- "Hello") x *= c.toInt
scala> x
res12: Int = 825152896
Que no coincide con su salida.
¿Cómo hago esto, tanto for
el for
y no for
way?
¡Gracias!
Creo que la conversión a mapa intermedio es ineficiente porque en este caso la colección se repite dos veces: una para crear un mapa de longitudes y una segunda para multiplicar todos los elementos. La colección temporal innecesaria de Long tampoco es necesaria. Doy mi voto a
"Hello".foldLeft(1L)(_ * _)
Cuando haga x.foldLeft(1)(_ * _.toInt)
, el tipo de resultado será inferencia a un Int
, pero 9415087488 es demasiado grande para que un Int
almacene.
Entonces debes decirle a Scala que use Long
para almacenarlo.
scala> val x = "Hello"
x: java.lang.String = Hello
scala> x.foldLeft(1L)(_ * _.toInt)
res1: Long = 9415087488
scala> var x: Long = 1
x: Long = 1
scala> for (c <- "Hello") x *= c.toInt
scala> x
res7: Long = 9415087488
Hay un método especial de "producto" en StringOps que multiplica los elementos de la colección. Pero usa el tipo Char porque la cadena consta de elementos char. Y estamos teniendo desbordamiento al intentar calcular el producto "Hello". Así que convertí la cadena a Vector of Long Unicode values con "Hello" .map (_. ToLong) y calculé el producto de sus elementos con este código:
scala> "Hello".map(_.toLong).product
res79: Long = 9415087488
La forma más directa que he encontrado para hacer esto es:
"Hello".foldLeft(1L)((x:Long, y:Char) => x*y)
El método toma dos parámetros: un Long y una función de delegado que toma un Long y un Char y devuelve un Long. Puede pasar una función anónima directamente así, o puede definir la función en otro lugar y pasarla, así:
def multiply(x:Long, y:Char) = {
x*y
}
"Hello".foldLeft(1L)(multiply)
Otra variante: "Hello".aggregate(1L)({(prod,ch) => prod * ch.toLong}, {(p1,p2)=>p1*p2})
Si convierte cada RichChar de String .toLong, también funciona. Por ejemplo, esto:
str.map (_.toLong).product
- el trabajo es correcto y sin doblez Izquierda o ciclos
Esta es una variante cíclica:
def product(str: String): Long = {
var prod: Long = 1
for (ch <- str) prod *= ch
prod
}