Подтвердить что ты не робот

Как правильно получить текущее количество циклов из Iterator в scala

Я перебираю следующие строки из файла csv для их анализа. Я хочу идентифицировать первую строку со своего заголовка. Каков наилучший способ сделать это вместо создания держателя счетчика var.

var counter = 0
for (line <- lines) {
  println(CsvParser.parse(line, counter))
  counter++
}

Я знаю, что есть лучший способ сделать это, новичок в Scala.

4b9b3361

Ответ 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.

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

НТН.