2016-10-21 2 views
0

в моей основной программе я получить входы, как - ключ1 = value1 key2 = значение2Преобразование командной строки ключевой аргумент = значение пары к карте в Скале

Теперь то, что я хочу, чтобы создать карту из нее. Я знаю императивный способ сделать это, когда я получаю Array [String], который может быть foreach, а затем разделен на «=», а затем ключ и значение могут использоваться для формирования Карты.

есть хороший функциональный и читаемый способ достижения этого? Также будет здорово, если я смогу избежать измененной карты, и я хочу избежать инициализации начальной инициализации.

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) 

Может быть, вы должны вызвать Function.unlift для IntelliJ

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

Ошибка при выходе «не может разрешить ссылку на такую ​​подпись» в intellij. –

+0

более точная ошибка - несоответствие типа, ожидаемое PartialFunction [String, NotInferedB], фактическое (любое) => (T, T) –

+0

да .. большое спасибо. Интересно, может ли intellij решить эту проблему. –

1

аналогичные выше, но с использованием только 'карта'

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

ПЛ см. Мой комментарий ниже. дает ошибку времени компиляции. –

+0

, затем его IDE, попробуйте использовать File-> Invalidates cache и перезапустите. Вы всегда можете проверить однострочные решения в scala repl, чтобы убедиться, что ваша IDE не возится с вами :) – freakman

0

Вы можете использовать Scopt, чтобы провести синтаксический анализ аргумента командной строки.

+0

У вас не всегда есть роскошь использовать любой открытый исходный код в соответствии с вашим комфортом :) –

+0

Это было предложение моего друга. :) –

Смежные вопросы