2016-08-19 110 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)