在Kotlin的阵列上循环

时间:2018-12-03 21:23:23

标签: android list kotlin iterator

Kotlin中是否有类似Guava库中的Cycle Iterator的东西?

https://google.github.io/guava/releases/15.0/api/docs/com/google/common/collect /Iterators.html#cycle(java.lang.Iterable)

我想循环一个数组,例如:

1 2 3 4
4 1 2 3
3 4 1 2

...

如果可能的话,可以使用原生Kotlin或公认的库。

我不想将番石榴添加到我的代码库中。

3 个答案:

答案 0 :(得分:2)

在阵列上使用slice()

array = arrayOf(array.last()) + array.sliceArray(0 until array.size - 1)

通过将最后一项放在第一位置并将其余项向右移动来重新排列数组。

var array = arrayOf(1, 2, 3, 4)

(0 until array.size).forEach {
    array.forEach { print(it.toString() + " ") }
    println()
    array = arrayOf(array.last()) + array.sliceArray(0 until array.size - 1)
}

将打印:

1 2 3 4 
4 1 2 3 
3 4 1 2 
2 3 4 1 


相同的结果可以通过以下方式实现:

array = arrayOf(array.last()) + array.filterIndexed { index, _ ->  index < array.size - 1 }.toTypedArray() 


此扩展功能:

fun <T> Array<T>.rightCycle(d: Int): Array<T> {
    val n = d % size
    if (n == 0) return this
    return sliceArray(size - n until size) + sliceArray(0 until size - n)
}

可用于循环每次放置d个数组:

var array = arrayOf(1, 2, 3, 4, 5, 6)

(0 until array.size).forEach {
    array.forEach { print(it.toString() + " ") }
    println()
    array = array.rightCycle(2)
}

将打印:

1 2 3 4 5 6 
5 6 1 2 3 4 
3 4 5 6 1 2 
1 2 3 4 5 6 
5 6 1 2 3 4 
3 4 5 6 1 2

答案 1 :(得分:1)

fun IntArray.pivoted(p: Int): IntArray = sliceArray(p until size) + sliceArray(0 until p)

例如可以这样使用(右旋转):

(array.size downTo 1).forEach {
    println(array.pivoted(it).joinToString())
}

val cycles = (0 until array.size).map {
    array.pivoted(array.size - it)
}

或这样(向左旋转)

val cycles = (0 until array.size).map {
    array.pivoted(it)
}

以标准方式发送到控制台

for (cycle in cycles) {
    println(cycle.joinToString())
}

答案 2 :(得分:0)

经过思考并检查了其他答案后,我也使用subList中的MutableList实现了一个版本:

fun <T> MutableList<T>.rotate(): MutableList<T> {
    val subList = this.toMutableList().subList(0, this.size - 1)
    subList.add(0, this.last())
    return subList
}



class BuildLeagueTournamentTest {


    @Test
    fun testInvoke() {
        val teams = createTeams()
        Assert.assertArrayEquals(intArrayOf(1,2,3,4), teams.toIntArray())

        var newTeams = teams.rotate()
        Assert.assertArrayEquals(intArrayOf(1,2,3,4), teams.toIntArray())
        Assert.assertArrayEquals(intArrayOf(4,1,2,3), newTeams.toIntArray())

        newTeams = newTeams.rotate()
        Assert.assertArrayEquals(intArrayOf(3,4,1,2), newTeams.toIntArray())

    }

    private fun createTeams(): MutableList<Int> {
        return mutableListOf(1, 2, 3, 4)
    }
}