【发布时间】:2020-01-02 17:25:28
【问题描述】:
enter code here
package anotherExample
object StringSplitter {
def computePercentTrue(line: String): Double = {
val splits: Array[String] = line.split(";")
var totalCount: Double = 0
//println("Hi!")
var trueCount: Double = 0
for (value <- splits) {
//println("Hello!")
val valueAsBoolean: Boolean = value.toBoolean
//println(3)
if (valueAsBoolean) {
trueCount += 1
}
totalCount += 1
}
trueCount / totalCount
}
def main(args: Array[String]): Unit = {
val testInput = "true; false; true; true; true"
val percentTrue = computePercentTrue(testInput) // expecting 0.8
println("Percentage true == " + percentTrue)
}
}
嗨,所以这段代码的重点是一串布尔值(真/假)并用分号分隔,我试图返回真值的百分比。我不明白错误消息,而且我是 Scala 新手,所以有人可以解释发生了什么吗?我收到此错误消息:
Exception in thread "main" java.lang.IllegalArgumentException: For input string: " false"
at scala.collection.immutable.StringLike.parseBoolean(StringLike.scala:327)
at scala.collection.immutable.StringLike.toBoolean(StringLike.scala:289)
at scala.collection.immutable.StringLike.toBoolean$(StringLike.scala:289)
at scala.collection.immutable.StringOps.toBoolean(StringOps.scala:33)
at anotherExample.StringSplitter$.$anonfun$computePercentTrue$1(StringSplitter.scala:11)
at anotherExample.StringSplitter$.$anonfun$computePercentTrue$1$adapted(StringSplitter.scala:9)
at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
at anotherExample.StringSplitter$.computePercentTrue(StringSplitter.scala:9)
at anotherExample.StringSplitter$.main(StringSplitter.scala:23)
at anotherExample.StringSplitter.main(StringSplitter.scala)
【问题讨论】:
-
“false”包含一个前导空格。
-
谢谢,当您使用 .split 时,我没有意识到空格很重要
-
使用 toBoolean 转换为布尔值时,空格很重要,因此格式解析错误(请注意有用的堆栈跟踪和消息中的特定值)。斯普利特不在乎,完全按照它的说法去做。考虑一个minimal SSCCE:“false”.toBoolean
-
一旦确定了该问题,Y 问题可能是:“如何分割字符并消除周围的空白?”
-
你可以使用修剪
val valueAsBoolean: Boolean = value.trim.toBoolean
标签: scala