Как инвертировать IndexedSeq в Scala? - PullRequest
3 голосов
/ 19 марта 2012

Имея IndexedSeq, как перебрать его с конца до начала?

Ответы [ 2 ]

9 голосов
/ 19 марта 2012

Вы можете позвонить reverseIterator, если хотите просто выполнить итерацию от конца к началу.Если вы хотите применить карту, reverseMap.foldLeft и foldRight перемещаются в противоположных направлениях, поэтому каждый из них может рассматриваться как другой в обратном списке;аналогично с reduceRight и scanRight.Есть куча last методов, чтобы найти вещи ближе к концу, а не к началу.Все остальное и reverse (для воссоздания всей коллекции) или .view.reverse.whatever, если вы не хотите дублировать коллекцию в памяти.Для простого foreach, reverseIterator, как правило, добьется цели.

4 голосов
/ 19 марта 2012

Вы можете просто перевернуть его:

scala> val x = IndexedSeq(1,2,3,4)
x: IndexedSeq[Int] = Vector(1, 2, 3, 4)

scala> x.reverse.foreach(println)
4
3
2
1

Или, в зависимости от того, что вы делаете во время итерации, foldRight может быть тем, что вы хотите.foldRight - это складка, которая перемещается справа налево через коллекцию.

scala> x.foldRight(0){ (item, total) => println("adding "+item); total + item }
adding 4
adding 3
adding 2
adding 1
res121: Int = 10
...