您可以通过几个简单的步骤轻松完成此操作:
- 首先将输入分成
List
一行
- 然后将每一行分成
List
一个String
s
- 然后将
String
列表中的每个转换为Int
- 最后总结this
List
of List
s List
to a List
of Array
s(使用简单的状态机)
状态机非常简单。
- 它首先读取下一个矩阵中的行数并记住它
- 然后它将该行数读入当前矩阵
- 在读取了记住的行数后,它将当前矩阵添加到读取矩阵列表中并返回到步骤 1
代码将如下所示:
import io.Source
def input = Source.fromString(
"""|3
|1 2 1
|1 2 2
|1 2 3
|4
|1 2 3 1
|1 2 3 2
|1 2 3 3
|1 2 3 4""".stripMargin) // You would probably use Source.fromFile(...)
type Matrix = List[Array[Int]]
sealed trait Command
case object ReadLength extends Command
case class ReadLines(i: Int, matrix: Matrix) extends Command
case class State(c: Command, l: List[Matrix])
val parsedMatrixes = input.getLines().map(_.split(" ")).map(_.map(_.toInt)).foldLeft(State(ReadLength, List())) {
case (State(ReadLength, matrixes), line) => State(ReadLines(line(0), List()), matrixes)
case (State(ReadLines(1, currentMatrix), matrixes), line) => State(ReadLength,((line::currentMatrix).reverse)::matrixes)
case (State(ReadLines(i, currentMatrix), matrixes), line) => State(ReadLines(i - 1, line::currentMatrix), matrixes)
}.l.reverse
并为您提供以下结果:
parsedMatrixes: List[Matrix] =
List(
List(Array(1, 2, 1),
Array(1, 2, 2),
Array(1, 2, 3)),
List(Array(1, 2, 3, 1),
Array(1, 2, 3, 2),
Array(1, 2, 3, 3),
Array(1, 2, 3, 4)))
请注意,这不是最终解决方案,因为它没有任何错误处理。而且它不会释放其资源(关闭源)。