Scala: Разделяне на низ на две цели числа

Това е текущият ми код. Искам да разделя низ на две цели числа и да ги съхранявам в променливи.

val line = "1 2"
var a = 0
var b = 0
val c = line.split(" ") match { case Array(x,y) => (x.toInt, y.toInt) }
a = c._1
b = c._2

Има ли някакъв начин да се направи нещо подобно в Scala? Това е много по-компактно.

(a,b) = line.split(" ") match { case Array(x,y) => (x.toInt, y.toInt) }

Изразът line.split(" ") match { case Array(x,y) => (x.toInt, y.toInt) } връща набор от цели числа, така че реших, че директното свързване на двете цели числа с променливите a и b ще работа.


person Dust009    schedule 23.09.2016    source източник


Отговори (5)


Това е много по-компактно и чисто

val Array(a,b) = line.split("\\s+").map(_.toInt)

Следният код работи дори ако има повече числа в низа

val Array(a, b, _*) = line split "\\s+" map(_ toInt)

точка по избор

val Array(a,b) = line split("\\s+") map(_.toInt)

какво ще кажете за това?

val Array(a,b) = line split "\\s+" map(_ toInt)

За по-конкретен случай направете това

val Array(a, ' ', b) = "1 2".toCharArray

Scala REPL

scala> val line = "1 2"
line: String = "1 2"
scala> val Array(a,b) = line.split("\\s+").map(_.toInt)
a: Int = 1
b: Int = 2

scala> val line = "1 2 3  4"
line: String = "1 2 3  4"
scala> val Array(a, b, _*) = line split "\\s+" map(_ toInt)
a: Int = 1
b: Int = 2

scala> val Array(a, ' ', b) = "1 2".toCharArray
a: Char = '1'
b: Char = '2'
person pamu    schedule 23.09.2016
comment
само бърз коментар, поправете ме, ако греша. Pattern match работи с Array, защото split е метод от Java String и връща String[] - така масив от низове. Концептуално ще върне List[String] или дори Iterable[String] - person iuriisusuk; 23.09.2016
comment
@ysusuk имате нужда от метод за отмяна на прилагането, за да работи съпоставянето на шаблони - person pamu; 23.09.2016
comment
това е ясно. Просто теоретизирах, че ако внедря Scala String, ще върна List[String] или Iterable[String] на split. List има unapply и Iterable ще се върне към List, тъй като е default реализация. - person iuriisusuk; 23.09.2016
comment
val Array(a, ' ', b) = 1 2.toCharArray това е още по-чисто - person pamu; 23.09.2016
comment
val Array(a, _, b) = 1 2.toCharArray - person iuriisusuk; 23.09.2016

Можете да използвате клас case, за да капсулирате вашата точка от данни:


  case class Datom(x: Int, y: Int)

  val datom = "1 2".split(" ") match { case Array(x, y) => Datom(x.toInt, y.toInt) }
  println(s"x = ${datom.x}, y = ${datom.y}")

person Nadim Bahadoor    schedule 23.09.2016

Нещо като:

val (d, e) = line.split(" ") match { case Array(x,y) => (x.toInt, y.toInt) }
person Moritz    schedule 23.09.2016

val str = "1 2"

val res = str.split(" ") 
val a = res.head.toInt 
val b = res.last.toInt

a и b са вашите необходими променливи.

person Jet    schedule 23.09.2016
comment
val res = str.split(" ").map(_.toInt) и след това res(0) res(1) - person Samar; 23.09.2016

person    schedule
comment
защо да използвате списък? - person cheseaux; 23.09.2016
comment
работи много добре с Array, както в примера на @pamu. Това е концептуален начин за разопаковане на елементи от списък, ако това е списъкът с параметри или конфигурационен списък, така че когато елементите имат идентичност (смисъл). Не просто списък от int или низове, но в нашия случай 1 може да бъде броят на тестовите случаи, 2 - може да бъде броят на елементите във всеки тестов случай или нещо подобно. - person iuriisusuk; 23.09.2016