32

そこで、私は「せっかちな人のための Scala」でいくつかの演習に取り組んでいます。そのうちの 1 つが次のとおりです。

for文字列内のすべての文字の Unicode コードの積を計算するループを作成します。たとえば、「こんにちは」の文字の積は 9415087488 L です。

次の問題は、forループなしで同じことを行うことです。これはStringOps、Scaladoc をチェックインする必要があることを示唆しています。

ScaladocのRichCharandセクションを確認しましたが、読み間違えているか、間違った場所を調べている可能性がありますが、出力と一致するものは見つかりません。StringOps私はこれまでに試しました:

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

これは彼らの出力と一致しません。

どうすればこれを行うことができforますforか?

ありがとう!

4

10 に答える 10

31

を実行するx.foldLeft(1)(_ * _.toInt)と、結果の型は に推論されますが、 に格納するIntには 9415087488 は大きすぎIntます。

そのため、ScalaLongにそれを格納するために使用するように指示する必要があります。

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
于 2012-06-23T00:18:42.177 に答える
13

String .toLong の各 RichChar を変換すると、それも機能します。たとえば、次のようになります。

str.map (_.toLong).product- 正常に動作し、foldLeft やサイクルはありません

これは循環バリアントです。

def product(str: String): Long = {
    var prod: Long = 1
    for (ch <- str) prod *= ch
    prod
}
于 2013-03-19T18:56:27.627 に答える
5

別の方法は次のとおりです。

scala> (for (c <- "Hello") yield c.toLong).product
res36: Long = 9415087488
于 2015-03-02T18:31:13.307 に答える
3

これを行うために私が見つけた最も簡単な方法は次のとおりです。

"Hello".foldLeft(1L)((x:Long, y:Char) => x*y)

このメソッドは、Long と、Long と Char を受け取り、Long を返すデリゲート関数の 2 つのパラメーターを取ります。次のように無名関数を直接渡すことも、別の場所で関数を定義して渡すこともできます。

def multiply(x:Long, y:Char) = {
    x*y
}
"Hello".foldLeft(1L)(multiply)
于 2014-04-08T02:34:25.420 に答える