2015-05-29 51 views
2

我想附加到一個數組,但由於某種原因,它只是將空格添加到我的數組中。斯卡拉追加到一個空陣列

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它只是1空白行。

+2

您不在任何地方存儲新數組的引用。 ('array:+ drop','array:+ drop.toString')'array'應該是'var' imho(或者使用fold/...)。 –

回答

3

斯卡拉的Array大小是不可變的。從Scala's reference

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

[用例]此數組的副本連同所附的元件。

因此:+返回一個新的數組不使用其參考。

val array = ... 

應該是:

var array = ... 

你應該更新與每個後得到的新的陣列是參考附加操作。

由於有不Scala中可變大小的數組,在插入後複製的替代的ArrayvarBufferArray,使用它的方法操作者+=追加新的元素,將獲得從緩衝器中得到的數組,例如:

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

RES2:數組[字符串] =陣列(你好,世界)

適用於您的代碼:

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 
    } 
+0

非常感謝您不僅給出答案,而且還解釋了爲什麼!這種語言和它微妙的細微差別的新! – theMadKing

+0

有點糾正:Scala數組不是不可變的。和Java一樣,Scala數組的_length_不能被修改,所以':+'必然會創建一個副本。但是數組可以用'myArray(0)= newVal;'這樣的語句就地更新。如果您將數組視爲不可變且因此線程安全,則會陷入各種麻煩。 –

+0

@SteveWaldman感謝您的觀察,我編輯了我的答案,包括更正。 –