Scala将参数拆分为多行并解析为Int

时间:2013-11-03 16:13:14

标签: scala idiomatic

这可能最终变得非常简单,但我要求更多帮助我学习更好的Scala成语(Python的人通过交易来学习一些scala技巧。)

我正在做一些黑客等级问题,输入要求的方法是从stdin读取行。该规范引用如下:

  

第一行包含测试用例T.T测试用例的数量   跟随。每个案例包含两个整数N和M.

因此,传递给脚本的输入看起来像这样:

4
2 2
3 2
2 3
4 4

我想知道这样做的正确,惯用方法是什么。我想到了一些:

  • 使用io.Source.stdin.readLines.zipWithIndex,然后在foreach中,如果索引大于0,则在空格上拆分并映射到(_.toInt)
  • 使用相同的readLines函数获取输入,然后根据索引进行模式匹配。
  • 在空格和换行符上拆分以制作单个数字列表,映射toInt,弹出第一个元素(问题大小),然后以模2形式为我的问题函数生成参数元组。

我想知道更有经验的scala程序员会考虑解析这些args的最佳方法,其中2个元素行将是函数的args,第一个单个数字行只是要解决的问题的数量。 / p>

2 个答案:

答案 0 :(得分:3)

也许你正在寻找这样的东西?

def f(x: Int, y: Int) = { f"do something with $x and $y" }

io.Source.stdin.readLines
  .map(_.trim.split("\\s+").map(_.toInt))    // split and convert to ints
  .collect { case Array(a, b) => f(a, b) }   // pass to f if there are two arguments
  .foreach(println)                          // print the result of each function call

答案 1 :(得分:0)

另一种阅读黑客排名问题输入的方法是使用scala.io.Stdin

import scala.io.StdIn
import scala.collection.mutable.ArrayBuffer

object Solution {
  def main(args: Array[String]) = {
    val q = StdIn.readInt
    var lines = ArrayBuffer[Array[Int]]()
    (1 to q).foreach(_ => lines += StdIn.readLine.split(" ").map(_.toInt))
    for (a <- lines){
      val n = a(0)
      val m = a(1)
      val ans = n * m
      println(ans)
    }
  }
}

我今天在Hacker Rank平台上测试了它,输出是:

4
6
6
16