9

indexこのコードでは、インクリメントして各yielding 結果に配置したいと考えています。

var index=0

for(str <- splitToStrings(text) ) yield  {

  if (index != 0) index += 1               // but index is equal to `0` all the time

  new Word(str, UNKNOWN_FORM, index )
}

変更できないのはなぜindexですか? そして、簡潔にしようとして、このロジックを実装する最良の方法は何ですか?

4

4 に答える 4

25

ほとんどのシーケンスのようなコレクションのzipWithIndexメソッドは、要素ごとにインクリメントするゼロベースのインデックスを提供します。

for ((str, index) <- splitToStrings(text).zipWithIndex)
  yield new Word(str, UNKNOWN_FORM, index)
于 2013-06-02T14:59:51.150 に答える
6

最初はインデックスが 0 に設定されているため、条件index != 0が true に実行されることはなく、インデックスがインクリメントされることもありません。この条件はいらないかも?たぶん、後で結果を数えることができますか?これで、インデックスがループ内で使用されていることがわかりました。次に、@BenJamesの回答を使用するか、再帰的にする必要があります。

于 2013-06-02T14:51:50.593 に答える
3

zipWithIndex新しいコレクションをコピーして作成するため、コレクションが大きくなる可能性がある場合は遅延させたほうがよい

for ((str, index) <- splitToStrings(text).view.zipWithIndex)
  yield new Word(str, UNKNOWN_FORM, index)

実際、インデックス付きシーケンスで作業している場合、より効率的な方法はindices、このシーケンスのすべてのインデックスの範囲を生成する を使用することです。

val strs = splitToStrings(text)

for(i <- strs.indices) yield  {
  new Word(strs(i), UNKNOWN_FORM, i )
}
于 2013-06-03T01:08:02.353 に答える
1
splitToStrings(text).foldLeft(0,List[Word]){(a,b) => {
   if(a._1!=0) (a._1+1,new Word(str, UNKNOWN_FORM, index) :: b)
   else (a._1,new Word(str, UNKNOWN_FORM, index) :: b)
}}

foldLeftここではタプルを次のように使用しindex = 0ていますList。次に、各要素を反復処理します。

aはこのタプルです。値を確認してindexインクリメントします。それ以外の場合は追加しませんindex。そしてWord、リストに新しいものを追加します。

最終的に、インデックス値を含むタプルと、すべての単語を含む合計リストを取得します。

于 2013-06-02T15:01:55.760 に答える