Сдвиг котлин массив - PullRequest
       0

Сдвиг котлин массив

0 голосов
/ 19 октября 2018

Предположим, что у меня есть массив типа 1 2 3 4 5, я хочу повернуть его влево на n и получить новый.

Например, 2 поворота вышеуказанного массива приведут к 3 4 5 1 2.Я не нашел никакой функции расширения, чтобы сделать это.

Ответы [ 4 ]

0 голосов
/ 19 октября 2018

Я интерпретирую "получить новый" , что означает, что функция расширения должна возвращать новый экземпляр, например, так (проверка границ не указана):

fun <T> Array<T>.shift(n: Int) = 
    let { sliceArray(n until size) + sliceArray(0 until n) }
0 голосов
/ 19 октября 2018

Вы можете использовать встроенный метод java Collections.rotate, но сначала вам нужно преобразовать массив в список:

val arr = intArrayOf(1, 2, 3, 4, 5)
val list = arr.toList()
Collections.rotate(list, -2)
println(list.toIntArray().joinToString())

Outputs

3, 4, 5, 1, 2
0 голосов
/ 19 октября 2018

Еще одна функция расширения, разделив массив на 2 части left и right и повторно собрав его в right + left:

fun <T> Array<T>.leftShift(d: Int) {
    val n = d % this.size  // just in case
    if (n == 0) return  // no need to shift

    val left = this.copyOfRange(0, n)
    val right = this.copyOfRange(n, this.size)
    System.arraycopy(right, 0, this, 0, right.size)
    System.arraycopy(left, 0, this, right.size, left.size)
}

так вот:

val a = arrayOf(1, 2, 3, 4, 5, 6, 7)
a.leftShift(2)
a.forEach { print(" " + it) }

напечатает

3 4 5 6 7 1 2
0 голосов
/ 19 октября 2018

Вы можете написать свою собственную функцию расширения на Array<T>

fun <T> Array<T>.leftShift(d: Int): Array<T> {
    val newList = this.copyOf()
    var shift = d
    if (shift > size) shift %= size
    forEachIndexed { index, value ->
        val newIndex = (index + (size - shift)) % size
        newList[newIndex] = value
    }
    return newList
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...