Scala:stdinから読み取るときにscanLeft1アイテム後ろ

アイデアボクサー

からの入力を処理するstdinscanLeft、結果の出力は常に最後の入力から1行遅れます。

io.Source.stdin
  .getLines
  .scanLeft("START:")((accu, line) => accu + " " + line)
  .foreach(println(_))

結果(私の手動入力の前には>):

> first
START:
> second
START: first
> third
START: first second

私が欲しい賢明な出力は次のとおりです。

> first
START: first
> second
START: first second
> third
START: first second third

ご覧のとおり、最初の入力行に続く出力には、最初の入力行の文字列がすでに含まれているはずです。

を使用してすでに試しました.scanLeft(...).drop(1).foreach(...)が、これにより次の結果が得られます。

> first
> second
START: first
> third
START: first second

純粋なシードを正しく省略して、目的の結果を得るにはどうすればよいですか?

[更新]当分の間、AndreyTyukinの気の利いた回避策に満足しています。それを提案してくれてありがとう。

ただし、もちろん、scanLeftシードを最初のアイテムとして次の反復チェーンに送信しない代替手段がある場合は、そのソリューションをお勧めします。

[更新]

ユーザーjwvhは私の目的を理解し、それに優れたソリューションを提供しました。彼らの提案を締めくくるために、私はそれらを累積コールバックに送る前に行を前処理する方法を探します。したがって、readLineコマンドは累積コールバックでは呼び出されるべきではありませんが、追加できる別のチェーンリンクで呼び出されます。

jwvh

あなたはとかなり似た何かを得ることができますStream.iterate()の代わりに、scanLeft()StdIn.readLineの代わりにstdin.getLines

def input = Stream.iterate("START:"){prev =>
  val next = s"$prev ${io.StdIn.readLine}"
  println(next)
  next
}

aStreamは怠惰に評価されるので、それを実現するための何らかの手段が必要になります。

val inStr = input.takeWhile(! _.contains("quit")).last
START: one                //after input "one"<return>
START: one two            //after input "two"<return>
START: one two brit       //after input "brit"<return>
START: one two brit quit  //after input "quit"<return>
//inStr: String = START: one two brit

getLinesそれが要件である場合、実際にはイテレータをあきらめる必要はありません

def inItr = io.Source.stdin.getLines

def input = Stream.iterate("START:"){prev =>
  val next = s"$prev ${inItr.next}"
  println(next)
  next
}

これがあなたのコメントに対応しているかどうかわからない。多くの場合、エラーが発生する可能性のある場所とその判別方法によって異なります。

Stream.iterate(document()){ doc =>
  val line = io.StdIn.readLine  //blocks here
                     .trim
                     .filterNot(_.isControl)
                     //other String or Char manipulations
  doc.update(line)
  /* at this point you have both input line and updated document to play with */
  ... //handle error and logging requirements
  doc //for the next iteration
}

.update()ソースドキュメント変更し、何も返さない(returns Unit仮定しましたこれは、update()メソッドの通常のシグネチャです

これの多くはコールチェーン(_.method1.method2.など)で実行できますが、それによって事態がさら​​に複雑になる場合があります。

対象の値を返さないメソッドは、ケストレルパターンと呼ばれるものを使用してコールチェーンに追加できます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

`stdin`から読み取るときにタイムアウトを追加する方法

分類Dev

ファイル記述子からアクティビティを読み取ろうとするときにブロックを選択する

分類Dev

stdinがパイプのときにデバイスから読み取る方法

分類Dev

ファイルから読み取ったときにforループの最後のアイテムを見つける方法-Python

分類Dev

stdinから読み取り、後でstdinをクリアする

分類Dev

アイテムを1回だけ読み取る必要がある場合、ルックアップ後にC#ディクショナリからアイテムを削除することによるパフォーマンス上の利点

分類Dev

テキストファイルからデータを読み取ろうとしているときに問題が発生する

分類Dev

dev c ++ mingw4.8.1でファイルから読み取ろうとしたときにセグメンテーション違反を受信する

分類Dev

C ++:データがパイプに書き込まれるときにstdinから読み取る

分類Dev

stdinから読み取るときのNilポインター逆参照動作

分類Dev

複数のファイルを一緒に開いてそれらから読み取ろうとしているときに、セグメンテーション違反(コアダンプ)が発生しました

分類Dev

なぜ `/ dev / random`から読み取ると、カーソルの後ろに` 1; 2c`文字が置かれるのですか?

分類Dev

なぜ `/ dev / random`から読み取ると、カーソルの後ろに` 1; 2c`文字が置かれるのですか?

分類Dev

subprocess.communicate(input_string)は引き続きstdinからの入力を読み取ろうとします

分類Dev

サーバーからコンテンツを読み取っているときに接続がタイムアウトする

分類Dev

テキストファイルを読み取ろうとしているときにJavaでランタイムエラーが発生する

分類Dev

パイプに書き込まずにパイプから読み取ろうとするとどうなりますか?

分類Dev

SDカードから読み取ろうとしているときにFileNotFoundExceptionが発生しました

分類Dev

開いていないファイルから読み取ろうとしたときに、libfuseファイルシステムが返すシステムエラーはどれですか?

分類Dev

stdinからarraylistへの入力を読み取ろうとしています

分類Dev

ファイルから読み取ろうとしている間、ベクトルイテレータは参照解除できません

分類Dev

zipファイルを読み取ろうとしているときにENOENT

分類Dev

dequeの後ろからアイテムを削除する

分類Dev

Cメールスロットから読み取ろうとしたときにファイル読み取りエラー87

分類Dev

非同期タスクでstdinを読み取るときに、「注釈付きI / OのブロックはTokioランタイムのコンテキストから呼び出す必要があります」

分類Dev

平均を計算するためにファイルから読み取ろうとしています-java

分類Dev

POSIXシェルのstdinから1文字を読み取ることはできますか?

分類Dev

Scala Shapeless-Generic.Reprの各アイテムを繰り返し/読み取るか、HListに変換します

分類Dev

execl()bashの後にstdinから読み取ると、eio(入力/出力エラー)が返されます

Related 関連記事

  1. 1

    `stdin`から読み取るときにタイムアウトを追加する方法

  2. 2

    ファイル記述子からアクティビティを読み取ろうとするときにブロックを選択する

  3. 3

    stdinがパイプのときにデバイスから読み取る方法

  4. 4

    ファイルから読み取ったときにforループの最後のアイテムを見つける方法-Python

  5. 5

    stdinから読み取り、後でstdinをクリアする

  6. 6

    アイテムを1回だけ読み取る必要がある場合、ルックアップ後にC#ディクショナリからアイテムを削除することによるパフォーマンス上の利点

  7. 7

    テキストファイルからデータを読み取ろうとしているときに問題が発生する

  8. 8

    dev c ++ mingw4.8.1でファイルから読み取ろうとしたときにセグメンテーション違反を受信する

  9. 9

    C ++:データがパイプに書き込まれるときにstdinから読み取る

  10. 10

    stdinから読み取るときのNilポインター逆参照動作

  11. 11

    複数のファイルを一緒に開いてそれらから読み取ろうとしているときに、セグメンテーション違反(コアダンプ)が発生しました

  12. 12

    なぜ `/ dev / random`から読み取ると、カーソルの後ろに` 1; 2c`文字が置かれるのですか?

  13. 13

    なぜ `/ dev / random`から読み取ると、カーソルの後ろに` 1; 2c`文字が置かれるのですか?

  14. 14

    subprocess.communicate(input_string)は引き続きstdinからの入力を読み取ろうとします

  15. 15

    サーバーからコンテンツを読み取っているときに接続がタイムアウトする

  16. 16

    テキストファイルを読み取ろうとしているときにJavaでランタイムエラーが発生する

  17. 17

    パイプに書き込まずにパイプから読み取ろうとするとどうなりますか?

  18. 18

    SDカードから読み取ろうとしているときにFileNotFoundExceptionが発生しました

  19. 19

    開いていないファイルから読み取ろうとしたときに、libfuseファイルシステムが返すシステムエラーはどれですか?

  20. 20

    stdinからarraylistへの入力を読み取ろうとしています

  21. 21

    ファイルから読み取ろうとしている間、ベクトルイテレータは参照解除できません

  22. 22

    zipファイルを読み取ろうとしているときにENOENT

  23. 23

    dequeの後ろからアイテムを削除する

  24. 24

    Cメールスロットから読み取ろうとしたときにファイル読み取りエラー87

  25. 25

    非同期タスクでstdinを読み取るときに、「注釈付きI / OのブロックはTokioランタイムのコンテキストから呼び出す必要があります」

  26. 26

    平均を計算するためにファイルから読み取ろうとしています-java

  27. 27

    POSIXシェルのstdinから1文字を読み取ることはできますか?

  28. 28

    Scala Shapeless-Generic.Reprの各アイテムを繰り返し/読み取るか、HListに変換します

  29. 29

    execl()bashの後にstdinから読み取ると、eio(入力/出力エラー)が返されます

ホットタグ

アーカイブ