Scala:将字符串拆分为两个整数

3
这是我的当前代码。我想将一个字符串拆分成两个整数并存储到变量中。
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相关联会起作用。

val List(a, b) = line.split(" ").toList - undefined
5个回答

9

这样更加紧凑和简洁

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

以下代码即使字符串中有更多的数字仍可以工作。
val Array(a, b, _*) = line split "\\s+" map(_ toInt)

点(dot)是可选的

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'

只是一个快速的评论,如果我错了,请纠正我。模式匹配与数组一起工作,因为split是Java String的方法,并返回String[] - 所以是字符串数组。从概念上讲,它将返回List[String]甚至是Iterable[String] - undefined
@ysusuk 你需要使用unapply方法才能使模式匹配生效。 - undefined
这很清楚。我只是在推测,如果我实现Scala的String,在split方法中会返回一个List[String]或者Iterable[String]Listunapply方法,而Iterable会回退到List作为它的默认实现。 - undefined
1
val Array(a, ' ', b) = "1 2".toCharArray 这样写更简洁 - undefined
val Array(a, _, b) = "1 2".toCharArray将字符串"1 2"转换为字符数组,并解构赋值给Array(a, _, b)。 - undefined

1
你可以使用一个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}")


1

val List(a, b) = line.split(" ").map(_.toInt).toList

的翻译结果为:

val List(a, b) = line.split(" ").map(_.toInt).toList


为什么使用列表? - undefined
它在Array中非常好用,就像@pamu的例子一样。这是一种从列表中解包元素的概念性方法,如果它是参数列表或配置列表的话,那么当元素具有身份(意义)时使用。不仅仅是整数或字符串的列表,而是在我们的情况下,1可以是测试用例的数量,2可以是每个测试用例中的元素数量,或者类似的情况。 - undefined

0

类似这样的:

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

-1
val str = "1 2"

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

ab是你需要的变量。


val res = str.split(" ").map(_.toInt) 然后 res(0) res(1) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接