字符串或字符串 - > Scala中的Unicode值?

ade*_*rtc 31 unicode scala

所以我正在完成"Scala for the Impatient"中的一些练习,其中一个是:

编写一个for循环来计算字符串中所有字母的Unicode代码的乘积.例如,"Hello"中的字符的乘积是9415087488 L.

下一个问题是做同样的事情,但没有for循环 - 它暗示我们应该检查StringOpsScaladoc.

我检查了Scaladoc中的RichCharStringOps部分,也许我误读或者看错了地方,但我找不到任何能让我匹配输出的东西.我到目前为止尝试过:

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
Run Code Online (Sandbox Code Playgroud)

哪个与他们的输出不匹配.

如何做到这一点,无论是for和非for的方式?

谢谢!

Bri*_*Hsu 30

当你这样做时x.foldLeft(1)(_ * _.toInt),结果类型将推断为a Int,但9415087488 Int对于存储它来说太大了.

因此,您需要告诉Scala使用Long它来存储它.

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
Run Code Online (Sandbox Code Playgroud)

  • 也谢谢我.奇怪的是,在刚下载的pdf版本中,给出了错误的值(825152896). (5认同)

set*_*810 13

如果你转换每个RichChar of String .toLong它也可以.例如,这个:

str.map (_.toLong).product - 工作很好,没有foldLeft或周期

这是循环变体:

def product(str: String): Long = {
    var prod: Long = 1
    for (ch <- str) prod *= ch
    prod
}
Run Code Online (Sandbox Code Playgroud)


小智 8

StringOps中有一个特殊的"产品"方法,它将系列的元素相乘.但它使用Char类型,因为字符串由char元素组成.我们在尝试计算"Hello".product时遇到了溢出问题.所以我通过"Hello".map(_.toLong)将字符串转换为Vector of Long Unicode值,并通过以下代码计算其元素的乘积:

scala> "Hello".map(_.toLong).product
res79: Long = 9415087488
Run Code Online (Sandbox Code Playgroud)


小智 5

这是另一种方式:

scala> (for (c <- "Hello") yield c.toLong).product
res36: Long = 9415087488
Run Code Online (Sandbox Code Playgroud)