【问题标题】:Why is mkString not working in Scala?为什么 mkString 在 Scala 中不起作用?
【发布时间】:2018-10-22 20:08:56
【问题描述】:

在 Scala 中,我无法像字符串一样正常打印数组

  val a = Array("woot","yeah","ok then").sorted

  for (i <- a.length-1 to 0 by -1)
    println(s"$i: ${a(i)}")

  val ab = ArrayBuffer(for (e <- a if e != null) yield e*3)

  println(ab.mkString(" "))

由于某种原因,这会打印:

2: yeah
1: woot
0: ok then
ArrayBuffer([Ljava.lang.String;@5034c75a)

我期待它打印"yeahyeahyeah wootwootwoot ok thenok thenok then",即数组中的项目(作为字符串)以空格分隔。为什么它不起作用,我做错了什么?

编辑: 好的,这表明因为我将 ab 初始化为一个元素 ArrayBuffer,该数组作为元素,而不是该内部数组的元素是分开的数组缓冲区的元素。

【问题讨论】:

  • 一切看起来都如预期的那样,你得到了你想要的。问题究竟出在哪里?为什么一直嵌套数组和数组缓冲区,有什么意义呢?这个问题似乎包含太多令人分心的信息。您能否专注于一个有问题的println,而不是七个不同的printlns? println(a.mkString(" ")) 怎么了?
  • 问题是我希望它将数组中的项目打印为用“”分隔的字符串,而不是“ArrayBuffer(....)”
  • 再次:最明显的解决方案a.mkString(" ") 有什么问题呢?
  • ArrayBuffer 的内容是单个元素(for-yield 生成的数组)。此单个元素的默认toString 会产生不可读的[Ljava.lang.String;@blah)-thingie。在这个阶段用空格将单个元素与其自身分开并没有帮助。只是不要将数组嵌套在数组缓冲区中,在这种情况下没有任何意义。

标签: arrays scala tostring


【解决方案1】:

使用更实用的方法的一些简短答案:

val a = Array("woot","yeah","ok then").sorted.reverse
a.map(_ * 3).map(elem => print(elem + " ")

编辑: 如果你想得到一些新变量的结果,你可以这样做:

val string = a.map(_ * 3).mkString(" ")

【讨论】:

    【解决方案2】:

    我想你的意思是

    val ab = ArrayBuffer((for (e <- a if e != null) yield e*3): _*)
    

    【讨论】:

      【解决方案3】:

      如果你想打印数组的每个元素,连接三次,条目之间有空格,那么它只是:

      println((for (e <- a) yield e * 3).mkString(" "))
      

      它给出:

      ok thenok thenok then wootwootwoot yeahyeahyeah
      

      (这是正确的顺序,因为您希望它按字母顺序排序,并且o w y)

      如果要在打印前反转数组,可以将其初始化为

      val a = Array("woot","yeah","ok then").sorted.reverse
      

      【讨论】:

      • 感谢简洁、富有表现力的方式。我主要想知道为什么它显示该类型并弄清楚了:这是因为我将 ArrayBuffer ab 初始化为一个 1 元素数组,其第一个元素是数组。执行 println(ab(0).mkString(" ")) 也与您的代码具有相同的效果。谢谢!
      • @JC 不客气。您还有其他问题或澄清要求吗?否则,您可以mark the question as solved
      猜你喜欢
      • 2014-07-28
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多