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 =来源| 目标= 2

但是,我希望:

    1 =来源| 目标= 1
    2 =来源| 目标= 2

问题:第二个文件(目标)被正确读取(逐行,即1和2),在第一个(源)中,只有第一行(即1)被读取。

最有可能的问题在于 for 循环。我虽然运算符“;” 行为类似于“&&”,因此应该同时从两个文件中读取一行。我试过替换“;” 通过“&&”,但它没有工作。

任何线索将不胜感激!托马斯

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) 这样编写的代码会产生笛卡尔积。在您的情况下,只要遍历第一个迭代器,它就会停止产生产品项(请记住 - 迭代器只能遍历一次)。

更新。

您的 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 回答