Как правильно получить текущий счетчик цикла от итератора в Scala - PullRequest
10 голосов
/ 13 января 2012

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

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

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

Ответы [ 2 ]

23 голосов
/ 13 января 2012

Попробуйте zipWithIndex:

for (line <- lines.zipWithIndex) {
  println(CsvParser.parse(line._1, line._2))
}

@enshi предложил следующее улучшение сопоставления с образцом:

for ((line, count) <- lines.zipWithIndex) {
  println(CsvParser.parse(line, count))
}
7 голосов
/ 14 января 2012

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

Но это было бы довольно долго, так что, оставьте меня в качестве варианта ответа.

Совершенно верно, что zip* методы полезны для создания таблиц со списками, но у них есть аналог, который они зацикливают списки для его создания.

Таким образом, общая рекомендация состоит в том, чтобы упорядочить действия, требуемые в списках, в view, чтобы объединить все из них, которые будут применены, только для получения результата. Получение результата рассматривается, когда возвращаемая сумма не равна Iterable. Например, foreach.

Теперь, говоря о первом ответе, если у вас есть lines, чтобы быть списком строк в очень большом файле (или даже перечисляемом в нем), zipWithIndex пройдет через все их и выдаст таблица (повторяемая из кортежей). Тогда для понимания снова вернется через то же количество предметов.

Наконец, вы повлияли на длину бега на n, где n - длина lines и добавили объем памяти m + n*16 (приблизительно), где m - lines ' след.

Предложение

lines.view.zipWithIndex map Function.tupled(CsvParser.parse) foreach println

Осталось несколько слов (обещаю), lines.view создаст что-то вроде scala.collection.SeqView, которое будет содержать всю дальнейшую функцию "отображения", создающую новые Iterable, как и zipWithIndex и map.

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

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...