【发布时间】:2017-04-17 17:57:39
【问题描述】:
我有一个directions 的列表,我想在右转或左转时找到下一个方向。这是我的工作代码:
enum class Turn { R, L }
enum class Direction { N, E, S, W }
val directionsInRightTurnOrder = listOf(Direction.N, Direction.E, Direction.S, Direction.W)
private fun calculateNextHeading(heading: Direction, turn: Turn): Direction {
val currentIndex = directionsInRightTurnOrder.indexOf(heading)
var nextIndex = currentIndex + if (turn == Turn.R) 1 else -1
if (nextIndex >= directionsInRightTurnOrder.size)
nextIndex = directionsInRightTurnOrder.size - nextIndex
if (nextIndex < 0)
nextIndex += directionsInRightTurnOrder.size
return directionsInRightTurnOrder.get(nextIndex)
}
- 但是,如果我可以获取
directionsInRightTurnOrder列表并无限地(并且懒惰地)循环浏览它,这将变得更加简单和容易阅读。在 Clojure 中,我可以做到这一点,使用 clojure.core/cycle:
(take 5 (cycle ["a" "b"]))
# ("a" "b" "a" "b" "a")
-
另一件有帮助的事情是,如果我可以使用负索引在列表中查找,例如在 Ruby 或 Python 中:
问题:
- 我可以通过 Kotlin 中的列表/集合执行
cycle吗? - 在 Kotlin 中是否有惯用的方法来进行负索引查找?
【问题讨论】:
标签: clojure kotlin lazy-sequences