2017-02-02 15 views
0

я сделал программу, которая печатает сумму двух массивов полученных в качестве аргументов командной строки:Как получить содержимое между скобками массивов String, переданными в качестве аргументов основному методу Scala?

object MyPackage{ 
    def main(args: Array[String]): Unit = { 
    println(sumTwoLists(stringToIntList(args(0)), stringToIntList(args(1)))) 
    } 

    private def sumTwoLists(list_1 : List[Int], list_2 : List[Int]) : List[Int] = { 
    (list_1, list_2).zipped.map(_ + _) 
    } 

    private def stringToIntList(string: String) : List[Int] = { 
    string.split(",").map(s => s.toInt).toList 
    } 
} 

sbt "run 1,2,3 4,5,6" работает отлично:

List(5, 7, 9) 

Мой вопрос, как я могу заставить его работать на sbt "run [1,2,3] [4,5,6]" ?

ответ

2

Предполагая, что вы хотите, чтобы преобразовать строку «[1,2,3]» в список List (1,2,3):

private def stringToIntList(string: String) : List[Int] = { 
    string.drop(1).dropRight(1).split(",").map(s => s.toInt).toList 
} 
0

Параметр ввода будет состоять из двух строк "[1,2,3]" и "[4,5,6]". Вам нужно разобрать их на List.

1

Я хочу поделиться более общее решение, чем это предложенное Томасом :

def stringToIntList(string: String) : List[Int] = { 
    string.filter(o => o.isDigit || o.equals(',')).split(',').map(o => o.toInt).toList 
    } 
2

ответ от @Thomas правильно.

Однако, если вы также хотели, чтобы синтаксис был правильным, вы можете использовать регулярное выражение с группой:

object Parser{ 
    lazy val r = new Regex("\\[(\\d(,\\d)?)\\]","numbers") 
    def stringToIntList(t : String): Option[List[Int]] = 
    r.findFirstMatchIn(t).map(m=>m.group("numbers").split(",").map(_.toInt).toList) 
} 

Parser.stringToIntList("[1]") //Some(List(1)) 
Parser.stringToIntList("[1,2]") //Some(List(1, 2))