【发布时间】:2018-12-03 21:23:23
【问题描述】:
Kotlin 中是否有类似 Guava 库中的 Cycle Iterator 的东西?
我想循环一个数组,比如:
1 2 3 4
4 1 2 3
3 4 1 2
...
如果可能的话,使用原生 Kotlin 或广为接受的库。
我不想将 Guava 添加到我的代码库中。
【问题讨论】:
标签: android list kotlin iterator
Kotlin 中是否有类似 Guava 库中的 Cycle Iterator 的东西?
我想循环一个数组,比如:
1 2 3 4
4 1 2 3
3 4 1 2
...
如果可能的话,使用原生 Kotlin 或广为接受的库。
我不想将 Guava 添加到我的代码库中。
【问题讨论】:
标签: android list kotlin iterator
在数组上使用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
【讨论】:
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())
}
【讨论】:
经过思考并检查其他答案后,我也实现了一个版本,使用来自MutableList 的subList:
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)
}
}
【讨论】: