【问题标题】:How do you pass multiple arguments into single variable in Scala如何将多个参数传递给 Scala 中的单个变量
【发布时间】:2017-06-18 00:24:10
【问题描述】:

我需要从命令行将多个参数传递给 scala 程序。 第一个是数据库,第二个是表,第三个需要是一个映射,其中 Map 可以具有 (String, Int) 的 1 到 n 个组合。然后我的脚本将像这样执行:

$ scala script.scala dbame 表名 Map(("score100", 20), ("score200", 10))

如何将该 Map 传递给脚本中的 fields 变量(参见下面的代码)?

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

【问题讨论】:

标签: scala


【解决方案1】:

只需将它们作为参数的平面列表传递:

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

然后你可以这样做:

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

【讨论】:

  • 我必须将 Seq 更改为 Array 才能正常工作。效果很好。
  • 似乎如果我传递具有不同值的相同参数键,则键会更新。 scala script.scala dbname tablename score1 10 score2 10 score1 20 将返回 score1 20 和 score2 10。我需要保留所有三个。
  • 那你就不能用地图了。 Map 只能有每个键之一。或者您可以将其设为Map[String, Seq[String]],将每个键映射到值集合而不是单个值:params.grouped(2).map(p => p.head -> p.last).groupBy(_._1).mapValues(_.map(_._2))
  • 这行得通。我必须在.groupBy 之前添加.toVector 以避免错误。
猜你喜欢
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2019-07-06
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
相关资源
最近更新 更多