2016-10-21 6 views
0

にマップするためのコマンドライン引数のキー=値のペアを変換する - KEY1 = VALUE1のKEY2を= value2のは、私のような入力を受け取る私のメインプログラムでScalaの

は今、私が何をしたいそれからマップを作成することです。私はforeachになるArray [String]を取得し、次に "="で分割してキーと値を使用してMapを形成できる、これを行うための不可欠な方法を知っています。

これを実現するには機能的で読みやすい方法がありますか? また、私は変更可能なマップを避けることができ、最初のダミー値の初期化を避けたい場合は素晴らしいことでしょう。

def initialize(strings: Array[String]): Unit = { 
    val m = collection.mutable.Map("dummy" -> "dummyval") 
    strings.foreach(
     s => { 
     val keyVal:Array[String] = s.split("=") 

     m += keyVal(0) -> keyVal(1) 

     }) 
    println(m) 
    } 

答えて

2

toMap()を使用できます。

しかし、タプルへの配列から変換することは非常に簡単ではありません。 How to convert an Array to a Tuple?

scala> val ar = Array("key1=value1","key2=value2") 
ar: Array[String] = Array(key1=value1, key2=value2) 

scala> ar.collect(_.split("=") match { case Array(x,y) => (x,y)}).toMap 
res10: scala.collection.immutable.Map[String,String] = Map(key1 -> value1, key2 -> value2) 

たぶん、あなたはIntelliJの

val r = ar.collect(Function.unlift(_.split("=") match { case Array(x, y) => Some(x, y)})).toMap 
+0

intellijの "このような署名に参照を収集できません"というエラーが発生しました。 –

+0

より正確なエラータイプの不一致、期待されるPartialFunction [String、NotInferedB]、実際の(Any)=>(T、T) –

+0

はい、ありがとうございます。私はintellijがこの問題を解決できるかどうか疑問に思います。 –

1
上記と同様の

だけ「マップ」を使用してのためにFunction.unliftを呼び出す必要があり

ar.map(_.split("=")).map(a=>(a(0), a(1))).toMap 
+0

私の下のコメントを参照してください。コンパイル時にエラーが発生する。 –

+0

あなたのIDEは、ファイル - >キャッシュを無効にして再起動してみてください。あなたはいつもあなたのIDEがあなたに邪魔していないことを確認するためにscala replの1行のソリューションを検証することができます:) – freakman

0

Scoptコマンドライン引数の構文解析をきちんと行います。

+0

あなたの都合に合わせてオープンソースを使うことは常に贅沢ではありません:) –

+0

私の提案です。 :) –

関連する問題