2016-08-19 7 views
0

私はScalaで新しいです。Scalaでベクターを作成する

私はSentenceと呼ばれるクラスのVectorを持っている:

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'を返しますので正しく動作しません。また、 'tree'は' 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 

それはemty Vectorと同等であるため、Optionはあまり持っていません。

+0

ありがとうございました!これはトリッキーでした: 'private val tree:Vector [Node] = words.map(w =>新しいノード(w、9、" d "、0))toVector' – elbaulp

+0

2つの変数を使ってマップを作成できますか? '(words、tags).map((w、t)=>新しいノード(w、t、" d "、0))'? – elbaulp

+0

単語とタグの内容が同期している場合(つまり、単語のn番目の要素がタグのn番目の要素に関連する場合)、words.zip(タグ)を使用して対応するペアの新しいシーケンスを作成し、尋ねる、例えばwords.zip(タグ).map((w、t)=>新しいノード(w、t、 "d"、0)) – Iadams

2

問題はforeachを使用していることです。 Array[A]の場合、foreachの署名はdef foreach(f: (A) ⇒ Unit): Unitです。戻り値の型はで、戻り値はUnitです。つまり、何も返されず、配列内の各要素で何か(printなど)を行うことになっています。

mapは、def map[B](f: (A) ⇒ B): Array[B]の署名があります。戻り値のタイプは、Bのインスタンスを返すことになっています。fBです。したがって、タイプAの各要素に対して、mapBのインスタンスを計算するためにfを適用します。

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) 
関連する問題