Велоспорт по массиву в Котлине - PullRequest
0 голосов
/ 04 декабря 2018

Есть ли в Kotlin что-то вроде Cycle Iterator из библиотеки Guava?

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

Iхочу циклически преобразовать массив, например:

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

...

Если возможно, с родным Kotlin или хорошо принятыми библиотеками.

Я не хотел бы добавлятьГуава к моей кодовой базе.

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018
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())
}
0 голосов
/ 04 декабря 2018

Подумав немного и проверив другие ответы, я также реализовал версию, используя 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)
    }
}
0 голосов
/ 04 декабря 2018

Использование slice() в массиве:

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

перестановка массива путем помещения последнего элемента в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...