una recorrer convertir con charcode cadena scala unicode

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 }