Scala向空数组添加元素

3
我试图将内容添加到一个数组中,但出现了一些问题,它只是向我的数组中添加了空白。
  def schemaClean(x: Array[String]): Array[String] =
  {
    val array = Array[String]()
    for(i <- 0 until x.length){
      val convert = x(i).toString
      val split = convert.split('|')
      if (split.length == 5) {
        val drop = split.dropRight(3).mkString(" ")
        array :+ drop
      }
      else if (split.length == 4) {
        val drop = split.dropRight(2).mkString(" ")
        println(drop)
        array :+ drop.toString
        println(array.mkString(" "))
      }
    }
   array
  }


  val schema1 = schemaClean(schema)

打印出这个:

record_id string

assigned_offer_id string

accepted_offer_flag string

current_offer_flag string

如果我尝试打印schema1,只会出现一行空白。

2
你没有在任何地方存储新数组的引用。(array :+ droparray :+ drop.toString)我认为 array 应该是一个变量(或者使用 fold/...)。 - Gábor Bakos
1个回答

7

Scala的Array大小是不可变的。引用自Scala官方文档

def
    :+(elem: A): Array[A] 

[用例] 这个数组的副本,其中附加了一个元素。
因此,:+ 返回一个新的数组,你没有使用其引用。
val array = ...

应该是:

var array = ...

您需要在每次添加操作后,更新该引用以使用新的数组。

由于Scala中没有可变大小的数组,替代一个插入后复制的Arrayvar的方法是使用BufferArray,使用其方法操作符+=来添加新元素并从缓冲区获取结果数组,例如:

import scala.collection.mutable.ArrayBuffer
val ab = ArrayBuffer[String]()
ab += "hello"
ab += "world"
ab.toArray

res2: 数组[String] = 数组(hello, world)

应用于你的代码:

def schemaClean(x: Array[String]): Array[String] =
  {
    val arrayBuf = ArrayBuffer[String]()
    for(i <- 0 until x.length){
      val convert = x(i).toString
      val split = convert.split('|')
      if (split.length == 5) {
        val drop = split.dropRight(3).mkString(" ")
        arrayBuf += drop
      }
      else if (split.length == 4) {
        val drop = split.dropRight(2).mkString(" ")
        println(drop)
        arrayBuf += drop.toString
        println(arrayBuf.toArray.mkString(" "))
      }
    }
   arrayBuf.toArray
  }

非常感谢您不仅提供答案,还解释了原因!我对这种语言及其微妙之处还很陌生! - theMadKing
稍作更正:Scala 数组并非不可变。与 Java 类似,Scala 数组的长度无法修改,因此 :+ 必然会创建一个副本。但是,可以使用类似 myArray(0) = newVal; 的语句来原地更新数组。如果将数组视为不可变且线程安全,则可能会遇到各种问题。 - Steve Waldman
@SteveWaldman 感谢您的观察,我已经编辑了我的答案以包含更正。 - Pablo Francisco Pérez Hidalgo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接