为什么打印 List[Array[String]] 不输出值?

Why printing List[Array[String]] does not output values?

我试图理解我从下面的代码中得到的输出,它显示了一些带有 @ 前缀的字母数字值。我怎样才能将它更改为 ("Hello,world"),("How,are,you")

Scala 代码:

val words = List("Hello_world","How_are_you" )
val ww= words.map(line=>line.split("_"))
println(ww)

输出

List([Ljava.lang.String;@7d4991ad, [Ljava.lang.String;@28d93b30)

这里的输出符合预期。它只是用@hashcode 打印出相应字符串的完全限定名称列表。大多数 JVM 语言的标准。

添加.toList

val ww = words.map(line=>line.split("_").toList)
// List(List(Hello, world), List(How, are, you))
ww == List(List("Hello", "world"), List("How", "are", "you")) // true

否则 wwList[Array[String]] 而不是 List[List[String]] 并且 println 显示数组的哈希码。

或者您正在寻找

val ww1 = words.map(_.replace("_", ","))
// List(Hello,world, How,are,you)
ww1 == List("Hello,world", "How,are,you") // true

像这样prettify Array printing consider ScalaRunTime.stringOf

import scala.runtime.ScalaRunTime.stringOf
println(stringOf(ww))

输出

List(Array(Hello, world), Array(How, are, you))

正如@Dmytro 所解释的那样,Arrays 与其他 Scala 集合(例如 List 有点不同,一个区别是它们被打印为 hashCode 表示

public String toString() {
  return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

而不是表示。

也许 mkString 就是您要找的东西?

scala> val ww2 = words.map(line=>line.split("_").mkString(","))
ww2: List[String] = List(Hello,world, How,are,you)

scala> println(ww2)
List(Hello,world, How,are,you)