首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在科特林以无限和懒惰的方式循环一个列表?

如何在科特林以无限和懒惰的方式循环一个列表?
EN

Stack Overflow用户
提问于 2016-12-02 18:24:36
回答 4查看 2.4K关注 0票数 8

我有一个directions列表,当我向右或向左拐时,我想找到下一个方向。下面是我的工作代码:

代码语言:javascript
运行
复制
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)
}
  1. 但是,如果我能够获得directionsInRightTurnOrder列表并无限地(而且懒洋洋地)遍历它,这将是非常简单和容易阅读的。在Clojure中,我可以使用核心/循环来做到这一点
代码语言:javascript
运行
复制
(take 5 (cycle ["a" "b"]))
# ("a" "b" "a" "b" "a")
  1. 另一件有用的事情是,如果我可以使用负索引查找列表,比如Ruby或Python:
代码语言:javascript
运行
复制
- [http://rubyquicktips.com/post/996814716/use-negative-array-indices](http://rubyquicktips.com/post/996814716/use-negative-array-indices)
- [Negative index to Python list](https://stackoverflow.com/questions/11367902/negative-index-to-python-list)

问题:

  • 我可以通过Kotlin的列表/集合来做cycle吗?
  • 在Kotlin,有没有一种习惯的方法来进行负索引查找?
EN

Stack Overflow用户

回答已采纳

发布于 2016-12-02 23:33:16

这是cycle

代码语言:javascript
运行
复制
fun <T : Any> cycle(vararg xs: T): Sequence<T> {
    var i = 0
    return generateSequence { xs[i++ % xs.size] }
}

cycle("a", "b").take(5).toList() // ["a", "b", "a", "b", "a"]

下面是实现转身应用程序的方法:

代码语言:javascript
运行
复制
enum class Turn(val step: Int) { L(-1), R(1) }

enum class Direction {
    N, E, S, W;

    fun turned(turn: Turn): Direction {
        val mod: (Int, Int) -> Int = { n, d -> ((n % d) + d) % d }
        return values()[mod(values().indexOf(this) + turn.step, values().size)]
    }
}

听起来modulo就是你要找的--负指数环绕。在Kotlin的stdlib里找不到所以我带了我自己的。

代码语言:javascript
运行
复制
Direction.N
    .turned(Turn.R) // E
    .turned(Turn.R) // S
    .turned(Turn.R) // W
    .turned(Turn.R) // N
    .turned(Turn.L) // W

Enum#values()Enum#valueOf(_)允许您以编程方式访问枚举的成员。

票数 9
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40938716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档