2016-08-19 108 views
0

我是Scala在Scala中填充矢量

我有一個Vector在一個名爲Sentence類:

val tree: Option[Vector[Node]] 

這個類的構造函數接受的話的Array[String]。對於每個單詞,我必須創建一個Node對象(我創建的一個類),然後用所有節點填充Vector

我想填充tree,但我在編寫代碼時遇到問題。我已經嘗試使用:

private val tree: Option[Vector[Node]] = 
    words.foreach(w => new Node(w, 9, "d", 0)) 

private val tree: Option[Vector[Node]] = 
    words.foreach(w => tree :: new Node(w, 9, "d", 0)) 

我也試圖與map,但它不工作。

我怎麼能爲每個單詞創建一個Node並將其添加到Vector

備註:如果您需要更多代碼,請告訴我和我更新問題。

+0

'foreach'返回'Unit',所以它不能正常工作。另外,你的''''是''Option [Vector [Node]]'的類型,你只需要把'Nodes'放入其中。編輯:讓張貼了一個點的答案。 – sebszyller

回答

1

簡單:

// map each word to a Node 
val tree: Array[Node] = words.map(w => new Node(w, 9, "d", 0)) 

如果你想有一個Vector

val treeVector: Vector[Node] = tree.toVector 

Option不會帶來多大的,因爲它相當於一個emty Vector

+0

謝謝!,這個訣竅在於:'private val tree:Vector [Node] = words.map(w => new Node(w,9,「d」,0))。toVector' – elbaulp

+0

有沒有辦法我可以使用兩個變量做一個地圖?像這樣:'(words,tags).map((w,t)=> new Node(w,t,「d」,0))'? – elbaulp

+0

如果單詞和標籤的內容是同步的(因此單詞的第n個元素與標籤的第n個元素相關),您可以使用words.zip(tags)來創建相應對的新序列,然後您可以製作問,例如 words.zip(tags).map((w,t)=> new Node(w,t,「d」,0)) – Iadams

2

問題是您正在使用foreach。並且對於Array[A]foreach具有簽名def foreach(f: (A) ⇒ Unit): Unit。這裏參數函數f的返回類型是Unit,這意味着它不應該返回任何東西,只需對數組中的每個元素執行一些操作(如打印)即可。

你在找什麼是map其中有簽名def map[B](f: (A) ⇒ B): Array[B]。這裏參數函數f的返回類型是B,這意味着它應該返回B類型的實例。因此對於類型爲A的每個元素,map將應用f來計算B類型的實例。

val newArray: Array[Node] = words.map(w => new Node(w, 9, "d", 0)) 

val newVector: Vector[Node] = newArray.toVector 

val optVector: Option[Vector[Node]] = Option(newVector) 

// Or 

val optVector = Option(words.map(w => new Node(w, 9, "d", 0)).toVector)