4

私はscalaが初めてで、この問題にぶつかりました:

def main(args: Array[String]){

val source = Source.fromFile(args(0))
val target = Source.fromFile(args(1))

for (lines <- source.getLines ; linet <- target.getLines) { 
  println(lines + " =source| target= " + linet);
}
}

ソース ファイルとターゲット ファイルに単純な数字 1、2 (各行に 1 つの数字) が含まれている場合、結果は次のようになります。

    1 =ソース| ターゲット= 1
    1 =ソース| ターゲット= 2

ただし、次のことを期待します。

    1 =ソース| ターゲット= 1
    2 =ソース| ターゲット= 2

問題: 2 番目のファイル (ターゲット) は正しく (行ごと、つまり 1 と 2) 読み取られますが、最初のファイル (ソース) では最初の行 (つまり 1) のみが読み取られます。

おそらく問題は for ループにあります。私は演算子「;」を使いました 「&&」のように動作するため、一度に両方のファイルから 1 行を読み取る必要があります。「;」を置き換えてみました "&&" で実行しましたが、うまくいきませんでした。

どんな手がかりも深く感謝します! トーマス

4

1 に答える 1

9

それらを圧縮して、行のペアを反復処理できます。

def main(args: Array[String]){

  val source = Source.fromFile(args(0)).getLines
  val target = Source.fromFile(args(1)).getLines

  for ((s,t) <- source.zip(target)) { 
    println(s + " =source| target= " + t);
  }
}

あなたのアプローチの問題は、for(x <-xs、y <-ys)のように書かれたコードがデカルト積を生成することです。あなたの場合、最初のイテレータがトラバースされる限り、製品のアイテムを生成することは停止します(イテレータは1回だけトラバースできることに注意してください)。

アップデート。

あなたのforループはjava/C ++ / ...でこれに類似しています:

for(int i = 0; i < source.length; i++)
  for(int j = 0; j < target.length; j++) {
    String s = source[i];
    String t = target[j];
    // println ....
  }

(その事実に加えて、上記ではイテレータを使用していません)

于 2012-12-11T15:44:27.450 に答える