Как прочитать каждую строку файла в отдельности, чтобы выполнить задачу в каждой строке?- Скала - PullRequest
0 голосов
/ 06 февраля 2019

Моя цель - прочитать файл по одной строке за раз и отделить эту конкретную строку на «&», а затем умножить все числа в этой строке.

Одна строка в файле будет выглядеть следующим образом:

2&3&5&1

В каждой строке может быть любое количество чисел и любое количество строк.

Вот что я пробовал:

import scala.io.{BufferedSource, Source}

object Multiply {

  def processFile(fileName: String): Int = {

    val file = Source.fromFile(fileName)
    var product: Int = 1

    for (line <- file.getLines()) {
      val splits = line.split("&")
      for (x <- splits) {
        product *= x.toInt
      }
    }

    product
  }
}

Это возвращает продукт всего файла.Мне нужна программа, чтобы распечатать продукт каждой линии в отдельности.Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вот один из способов исправить это:

import scala.io.Source

object Multiply {
  def main(args: Array[String]): Unit = {

    // assumes `fileName` is in the first arg
    val fileName = args(0)

    for (line <- Source.fromFile(fileName).getLines()) {
      println(line.split("&").map(_.toInt).product)
    }
  }
}

Некоторые подсказки:

  • Не вводите ненужных узких мест.Функция с сигнатурой def processFile(name: String): Int в основном бесполезна, потому что она не может ни принять обратный вызов для вызова в каждой строке, ни возвращать последовательность целых чисел, поэтому она не подходит для выполнения чего-либо с каждой строкой .
  • Вместо изменяемой переменной аккумулятора product используйте reduce или foldLeft.например,

    line.split("&").map(_.toInt).foldLeft(1)(_ * _)
    

    будет эквивалентно тому, что вы сделали, но, к счастью, для этого особого случая есть более короткий .product метод умножения всех чисел в последовательности.

  • Вы можете объединить несколько вызовов методов, нет необходимости вводить переменную для каждого промежуточного результата.
  • Сравнить историю редактирования: придерживаться соглашений об именах, отступать свой код.
0 голосов
/ 06 февраля 2019

Я думаю, что вложенные циклы for могут быть вашей проблемой.Любой путь начинался с нуля с for-yield подходом и более функциональным map.toList просто печатает на REPL.

scala> file
res25: String =
2&3&5&1
1&1&2&2
42&2&1&1
42&3&1&1

scala> for (line <- file.lines)
     | yield line.split("&").map(_.toInt).product
res26: Iterator[Int] = non-empty iterator

scala> res26.toList
res27: List[Int] = List(30, 4, 84, 126)

scala> file.lines.map(line => line.split("&").map(_.toInt).product).toList
res28: List[Int] = List(30, 4, 84, 126)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...