2013-11-03 46 views
2

這可能最終會變得非常簡單,但我希望更多地幫助我學習更好的Scala成語(交易中的Python人學習一些scala技巧。)Scala將參數分成若干行並解析爲Int

我正在做一些黑客等級問題,輸入方法需要的是從標準輸入讀取行。規格如下:

第一行包含測試用例的個數T.T測試用例如下: 。每個案例包含兩個整數N和M

所以在傳遞給腳本的輸入看起來是這樣的:

4 
2 2 
3 2 
2 3 
4 4 

我想知道什麼是做這種正確的,習慣的方法。我想過幾個:

  • 使用io.Source.stdin.readLines.zipWithIndex,然後從一個foreach內,如果該指數大於0,在空格分開,並映射到(_.toInt)
  • 使用相同readLines函數來獲取輸入然後與索引進行模式匹配。
  • 將空格和換行符分割成單個數字列表,地圖toInt,彈出第一個元素(問題大小),然後模2,爲我的問題函數生成參數的元組。

我想知道什麼更有經驗的程序員階會考慮分析這些ARGS,其中2元線將參數傳遞給函數,第一,單一數字線最好的辦法是問題,只是數量解決。

回答

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 
+0

真棒,工作大。 – DeaconDesperado

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) 
    } 
    } 
} 

我今天測試了黑客排名平臺,輸出是:

4 
6 
6 
16