2017-06-17 25 views
0

我需要從命令行將多個參數傳遞到scala程序中。 第一個是數據庫,第二個是表格,第三個是地圖,其中Map可以有1到n個(String,Int)組合。我的腳本將被這樣執行:如何將多個參數傳遞到Scala中的單個變量中

$斯卡拉script.scala dbame表名地圖(( 「score100」,20),( 「score200」,10))

如何傳遞映射到我的腳本中的字段變量(見下面的代碼)?

val database = args.length match {            
    case x:Int if x>0 => args(0) 
    case _ => { 
    println("error") 
    System.exit(1) 
    } 
} 

val table = args.length match { 
    case x:Int if x>1 => args(1) 
    case _ => { 
    println("error") 
    System.exit(1) 
    } 
} 

val fields = args.length match { 
    case x:Int if x>2 => args(2) 
    case _ => { 
    println("error") 
    System.exit(1) 
    } 
} 
+0

很可能是這樣的:https://開頭stackoverflow.com/questions/367706/how-to-parse-command-line-arguments-in-java –

回答

2

只是將它們作爲參數,以平面列表:

scala script.scala dbame tablename score100 20 score 200 10 ...

然後,你可以做這樣的事情:

val (dbname, tablename, params) = args match { 
    case Seq(dbname, tablename, [email protected]_*) => 
     (dbname, tablename, params.grouped(2).map(p => p.head -> p.last).toMap) 
    case _ => throw new IllegalArgumentException("dbname and tablename must be given) 
} 
+0

我不得不將Seq更改爲Array才能正常工作。很棒。 – nickfrenchy

+0

看來,如果我通過不同的值相同的參數鍵,密鑰更新。 scala script.scala dbname表名score1 10 score2 10 score1 20 將返回score1 20和score2 10. 我需要保留所有三個。 – nickfrenchy

+0

然後你不能使用該地圖。地圖只能有每個鍵中的一個。或者你可以將其設置爲Map [String,Seq [String]],將每個鍵映射到一個值集合而不是一個單獨的值:'params.grouped(2).map(p => p.head - > p.last).groupBy(_._ 1).mapValues(_。map(_._ 2))' – Dima

相關問題