Как правильно получить текущее количество циклов из Iterator в scala
Я перебираю следующие строки из файла csv для их анализа. Я хочу идентифицировать первую строку со своего заголовка. Каков наилучший способ сделать это вместо создания держателя счетчика var.
var counter = 0
for (line <- lines) {
println(CsvParser.parse(line, counter))
counter++
}
Я знаю, что есть лучший способ сделать это, новичок в Scala.
Ответы
Ответ 1
Попробуйте zipWithIndex
:
for (line <- lines.zipWithIndex) {
println(CsvParser.parse(line._1, line._2))
}
@tenshi предложил следующее улучшение при сопоставлении с образцом:
for ((line, count) <- lines.zipWithIndex) {
println(CsvParser.parse(line, count))
}
Ответ 2
Я полностью согласен с данным ответом, тем не менее, я должен указать что-то важное, и изначально я планировал внести простой комментарий.
Но это было бы довольно долго, так что не оставляйте меня в качестве варианта ответа.
Допустимо верно, что методы zip*
полезны для создания таблиц со списками, но у них есть аналоги, что они зацикливают списки, чтобы их создать.
Итак, общая рекомендация состоит в том, чтобы упорядочить действия, требуемые для списков в view
, чтобы вы объединили все их для применения, только для получения результата потребуется. Получение результата считается, когда возвращаемое значение не является Iterable
. Например, foreach
.
Теперь, говоря о первом ответе, если у вас есть lines
, чтобы быть списком строк в очень большом файле (или даже enumeratee на нем), zipWithIndex
будет проходить через все из них и создавать table (Итерируемый кортежей). Затем понимание будет возвращено через ту же сумму.
Наконец, вы повлияли на текущую длину на n
, где n
- длина lines
и добавили объем памяти m + n*16
(грубо), где m
- это lines
' след.
Предложение
lines.view.zipWithIndex map Function.tupled(CsvParser.parse) foreach println
Несколько слов осталось (я обещаю), lines.view
создаст что-то вроде scala.collection.SeqView
, которое будет удерживать всю дополнительную функцию "mapping", создавая новый Iterable, как и zipWithIndex
и map
.
Более того, я считаю, что выражение более элегантное, потому что оно следует читателю и логично.
"Для строк создайте представление, в котором застегните каждый элемент с индексом, результат будет отображается на результат анализатора , который должен быть напечатан".
НТН.