Scala执行代码得到Array[Boolean],如何转为含0和1的Array[Int]?
解决Scala中返回Array[Boolean]而非Array[Int]的问题
看起来你是在处理情感分析时,不小心让map操作返回了布尔值而不是预期的0/1整数。这种情况通常是因为代码中某个分支返回了布尔表达式,而非明确的Int类型值——比如直接把AFINN.lookup(...).length > 0这样的判断作为返回结果,而不是返回你定义的senti变量。
下面给你两种修正方案,既解决类型问题,又让代码更简洁安全:
方案1:修复原有代码逻辑,明确返回Int
保留你原来的变量写法,确保最后返回的是定义的Int类型变量senti,同时避免索引越界问题:
val reviewSenti = extracted_reviews.map(reviewText => { val reviewWordsSentiment = reviewText.getString(0).split(" ").map(word => { var senti: Int = 0 val lowerWord = word.toLowerCase() val sentimentList = AFINN.lookup(lowerWord) if (sentimentList.nonEmpty) { // 这里可以根据你的需求调整:比如找到情感词就设为1,或者用情感值的正负来设1/0 senti = 1 // 如果是根据情感值正负:senti = if (sentimentList(0) > 0) 1 else 0 } senti // 必须明确返回这个Int变量,而不是if表达式的结果 }) reviewWordsSentiment })
方案2:用函数式风格简化代码(推荐)
去掉可变变量var,用headOption安全处理空数组的情况,代码更简洁且不易出错:
val reviewSenti = extracted_reviews.map(reviewText => { reviewText.getString(0).split(" ").map(word => { val lowerWord = word.toLowerCase() // 检查是否找到情感词,找到返回1,否则返回0 AFINN.lookup(lowerWord).headOption.map(_ => 1).getOrElse(0) // 如果需要根据情感值正负返回1/0: // AFINN.lookup(lowerWord).headOption.map(s => if (s > 0) 1 else 0).getOrElse(0) }) })
关键注意点:
- 避免直接用
AFINN.lookup(...)(0),如果lookup返回空数组会抛出索引越界异常,用headOption更安全 - 确保
map操作的最后一行是Int类型的值,而不是布尔表达式(比如sentimentList.nonEmpty本身是Boolean,如果把它作为返回值,就会得到Array[Boolean])
内容的提问来源于stack exchange,提问作者Parv bali
相关产品推荐
相关产品推荐

