Обработка InputStream в Scala - PullRequest
       17

Обработка InputStream в Scala

0 голосов
/ 22 июня 2019

У меня есть метод, который принимает inputStream в качестве параметра.InputStream, который содержит следующие

  • input:

  • Строка, содержащая одно число: N

  • За ними следуют N строк, содержащих два числа Ti и Li, разделенных пробелом.

  • Может быть заключительный символ новой строки.

Вопросявляется: Как я могу читать и управлять потоком в Scala?

def process(in: InputStream): Long = ???

1 Ответ

2 голосов
/ 22 июня 2019

В следующем примере кода прочитайте n из первой строки, затем для каждой строки рассчитайте умножение ti * li и общей суммы.

import java.io.InputStream
import java.io.ByteArrayInputStream
import java.nio.charset.StandardCharsets

import scala.io.Source
import scala.util.matching.Regex

  def process(in: InputStream): Long = {
    val lines = Source.fromInputStream(in).getLines()
    val n = lines.next().toInt
    val pattern: Regex = """\s*(\d+)\s+(\d+)\s*""".r
    lines.map {
      case pattern(ti, li) => ti.toInt * li.toInt
      case _ => 0
    }.sum
  }

  test("process InputStream") {
    val lines =
      raw"""3
           |1 10
           |2 200
           |3 3000
           |""".stripMargin
    println(lines)
    val is: InputStream = new ByteArrayInputStream(lines.getBytes(StandardCharsets.UTF_8))

    assert(process(is) == 9410)
  }
...