【问题标题】:Reading multiple integers from line in text file从文本文件的行中读取多个整数
【发布时间】:2020-07-28 15:56:51
【问题描述】:

我正在使用 Scala 并从控制台读取输入。我能够反刍构成每一行的字符串,但如果我的输入具有以下格式,我如何访问每行中的每个整数?

2 2
1 2 2
2 1 1

目前我只是将输入反刍回控制台使用

object Main {
  def main(args: Array[String]): Unit = {
    for (ln <- io.Source.stdin.getLines) println(ln)
    //how can I access each individual number within each line?
  }
}

我需要像这样编译这个项目:

$ scalac main.scala

$ scala Main <input01.txt
2 2
1 2 2
2 1 1

【问题讨论】:

  • 你需要一个整数列表还是整数列表?

标签: scala console stdout stdin


【解决方案1】:

一个合理的算法应该是:

  • 对于每一行,将其拆分为单词
  • 将每个单词解析成Int

该算法的实现:

io.Source.stdin.getLines  // for each line...
  .flatMap(
    _.split("""\s+""")    // split it into words
      .map(_.toInt)       // parse each word into an Int
  )

这个表达式的结果将是一个Iterator[Int];如果你想要一个Seq,你可以在那个Iterator上调用toSeq(如果有合理的机会会有超过7个左右的整数,那么可能值得调用toVector)。如果有一个不是整数的单词,它将以NumberFormatException 爆炸。你可以通过几种不同的方式来处理这个问题......如果你想忽略不是整数的单词,你可以:

import scala.util.Try

io.Source.stdin.getLines
  .flatMap(
    _.split("""\s+""")
      .flatMap(Try(_.toInt).toOption)
  )

【讨论】:

  • 为什么是toVector?但无论如何,+1 不使用 Seqs 而是使用任何具体的集合 (我只会使用 List。 - 在2.13 中,您可以使用toIntOption 而不是Try(_.toInt).toOption
  • 超过大约 7 个元素(它会因一个 JVM 和底层架构而异),Vector 的内存效率比 List 高得多,而 map 的性能基本相同/flatMap/filter 和朋友(这通常是你想要的任何收藏)。前置和 head/tail 分解是 IMO 在 IndexedSeq 上使用 LinearSeq 的唯一原因。
  • 我对此表示怀疑,我很确定在大多数情况下,List 实际上比 Vector 更节省内存和 CPU。使用 IndexedSeq* 的唯一原因是如果您需要通过索引 快速访问(这在功能代码中很奇怪) 并且在这种情况下使用 ArraySeq 优于 Vector
  • List 根据定义为每个元素创建一个新对象(每个元素大约 30 个字节)。 Vector 为每 32 个(或其部分元素)创建一个大小为 32 的新数组,因此前 32 个元素大约为 200 个字节。
  • 哦,所以我一定是误解了 Martin 在 Coursera 课程中的解释,或者事情发生了变化。无论如何,那篇文章已经很老了,它使用了 Scala 2.11 很多关于 2.13 中的集合的更改,所以它不再那么重要了。不管怎样,再一次,同意不同意,就像李说的那样,随便挑一个,继续你的生活。我只是发现 List 在大多数情况下更有用,而 ArraySeq 可以更好地替代 Vector
【解决方案2】:

以下将为您提供一个简单的数字列表。

val integers = (
  for {
    line <- io.Source.stdin.getLines
    number <- line.split("""\s+""").map(_.toInt)
  } yield number
)

您可以阅读here,在解析数字时必须小心。

【讨论】:

    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多