【问题标题】:Cycling over an array in Kotlin在 Kotlin 中循环遍历数组
【发布时间】:2018-12-03 21:23:23
【问题描述】:

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 或广为接受的库。

我不想将 Guava 添加到我的代码库中。

【问题讨论】:

    标签: android list kotlin iterator


    【解决方案1】:

    在数组上使用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
    

    【讨论】:

    • 这应该会有所帮助
    【解决方案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())
    }
    

    【讨论】:

      【解决方案3】:

      经过思考并检查其他答案后,我也实现了一个版本,使用来自MutableListsubList

      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)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-06-04
        • 1970-01-01
        • 2019-07-10
        • 2012-05-24
        • 2016-05-25
        • 2020-11-24
        • 1970-01-01
        相关资源
        最近更新 更多