Scala分别读取第一行元素

时间:2016-01-07 15:24:44

标签: scala

我在一行上有以下输入:

  1. 数组中的元素数
  2. 数组的元素
  3. 例如

    3 1 2 3
    

    5 10 20 30 40 50
    

    35是元素的数量。

    我想在Scala中读到这个(首先是元素的数量,然后是元素)。

    我尝试过这样的事情:

        val n = readInt
        val a = readLine.split(" ").map(_.toInt)
    

    但是,这并没有正确读取n

    那么阅读本文的最佳方式是什么?

5 个答案:

答案 0 :(得分:3)

您可以使用split(" ")splitAt(1)的组合来创建包含第一个元素和其余元素的元组:

scala> val s = "3 1 2 3"
s: String = 3 1 2 3

scala> val (Array(nb), rest) = s.split(" ").map(_.toInt).splitAt(1)
nb: Int = 3
rest: Array[Int] = Array(1, 2, 3)

(显然,在您的情况下,您会将s替换为readLine

答案 1 :(得分:2)

最新的scala中不推荐使用

readLine。尝试使用scala.io.StdIn.readLine之类的

val a = scala.io.StdIn.readLine().split(" ").tail.map(_.toInt)

如果用户输入3 10 20 30,则a: Array[Int] = Array(10, 20, 30)

答案 2 :(得分:1)

这可能吗?

val a = readLine.split(" ").tail.map(_.toInt)
val n = a.length

答案 3 :(得分:1)

另一种使用List的解决方案,它有一个方便的提取器。

@ val s = "3 1 2 3"
s: String = "3 1 2 3"
@ val nb :: rest = s.split(" ").map(_.toInt).toList
nb: Int = 3
rest: List[Int] = List(1, 2, 3)

答案 4 :(得分:1)

另一种从val in = "3 1 2 3"中的集合中提取值到元素的头部和其余部分的方法,如下所示,

val Array(n, xs @_*) = in.split("\\W+").map(_.toInt)

提供

n: Int = 3
xs: Seq[Int] = Vector(1, 2, 3)

在这里,我们按字母数字值进行拆分,将其转换为Int值,并从标有n的其余部分中提取头xs