So I'm working through a few of the exercises in "Scala for the Impatient" and one of them is:
Write a for
loop for computing the product of the Unicode codes of all letters in a string. For example, the product of the characters in "Hello" is 9415087488 L.
The next problem is to do the same, but without a for
loop - it hints that we should check StringOps
in Scaladoc.
I checked the RichChar
and StringOps
section in Scaladoc, and perhaps I'm misreading or looking in the wrong places, but I can't find anything that gets me to match their output. I've thus far tried:
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
Which does not match their output.
How do I do this, in both the for
and non-for
way?
Thanks!
A string literal is a sequence of characters in double quotes. The characters are either printable unicode character or are described by escape sequences. If the string literal contains a double quote character, it must be escaped, i.e. "\"" . The value of a string literal is an instance of class String .
Scala Char |(x: Char) method with exampleThe |(x: Char) method is utilized to find the bit-wise OR of the stated character value and given 'x' in the argument list. Return Type: It returns the bit-wise OR of the stated character value and given 'x'.
An escape value is a backslash with a character that will escape that character to execute a certain functionality. We can use these in character and string literals. We have the following escape values in Scala: Escape Sequences. Unicode.
Unicode is an international standard of character encoding which has the capability of representing a majority of written languages all over the globe. Unicode uses hexadecimal to represent a character. Unicode is a 16-bit character encoding system. The lowest value is \u0000 and the highest value is \uFFFF.
When you do x.foldLeft(1)(_ * _.toInt)
, the result type will be inference to an Int
, but 9415087488 is too large for an Int
to store it.
So you need to tell Scala using Long
to store it.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With