Kotlin中是否有类似Guava库中的Cycle Iterator的东西?
我想循环一个数组,例如:
1 2 3 4
4 1 2 3
3 4 1 2
...
如果可能的话,可以使用原生Kotlin或公认的库。
我不想将番石榴添加到我的代码库中。
答案 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)
}
}