Есть ли Scala-эквивалент для перечисления Python? - PullRequest
34 голосов
/ 27 июня 2011

Мне бы хотелось удобство

for i, line in enumerate(open(sys.argv[1])):
  print i, line

при выполнении следующих действий в Scala

for (line <- Source.fromFile(args(0)).getLines()) {
  println(line)
}

Ответы [ 2 ]

43 голосов
/ 27 июня 2011

Вы можете использовать черту zipWithIndex из Iterable:

for ((line, i) <- Source.fromFile(args(0)).getLines().zipWithIndex) {
   println(i, line)
}
1 голос
/ 20 октября 2018

Как уже отвечали другие, если вы хотите, чтобы ваш индекс начинался с 0, вы можете использовать zipWithIndex:

for ((elem, i) <- collection.zipWithIndex) {
    println(i, elem)
}

Поскольку zipWithIndex создает новую последовательность из существующей последовательности, вы можете захотетьчтобы вызвать view перед его вызовом: collection.view.zipWithIndex.

Кроме того, Python enumerate имеет необязательный параметр для установки начального значения ваших индексов.В scala следующее установит начальное значение равным 1:

for ((elem, i) <- collection.zip(Stream from 1) {
    println(i, elem)
}

Для более подробного обсуждения прочитайте https://alvinalexander.com/scala/how-to-use-zipwithindex-create-for-loop-counters-scala-cookbook.

...