Как перемешать 2-мерный массив на первом уровне только в Kotlin - PullRequest
0 голосов
/ 25 января 2020

У меня есть двумерный массив Array<Array<Int>>, который я хочу перетасовать только на первом уровне, но у меня ничего не получилось.

contentTitle = arrayOf(
                arrayOf(R.drawable.ic_fathah1_1, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_2, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_3, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_4, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_5, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_6, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_7, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_8, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_9, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_10, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_11, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_12, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_13, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_14, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_15, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_16, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_17, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_18, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_19, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_20, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_21, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_22, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_23, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_24, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_25, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_26, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_27, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_28, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_29, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_30, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_31, R.raw.ahem_x)
            )
            contentTitle.shuffle()

Я гуглил по этому вопросу и нашел перетасовки только для изменяемого списка , Как мне добиться простого перемешивания для моего массива первого уровня?

Ответы [ 3 ]

1 голос
/ 25 января 2020

К сожалению, в настоящее время нет реализации shuffle() для массивов. См. обсуждение здесь и соответствующий выпуск . В настоящее время вы можете добавить свою собственную реализацию, например:

fun Array.shuffle(rnd: java.util.Random) {
    // Fisher-Yates shuffle algorithm
    for (i in this.size - 1 downTo 1) {
        val j = rnd.nextInt(i + 1)
        val temp = this[i]
        this[i] = this[j]
        this[j] = temp
    }
} 

Реализация, основанная на реализации MutableList.shuffle(), вы можете найти ее здесь .

Другое решение может быть преобразовать массив в список, перемешать его и преобразовать обратно, но это неэффективный подход:

val array = arrayOf(1, 2, 3, 4)
val shuffledArray = array
    .toMutableList()
    .apply { shuffle() }
    .toTypedArray()
1 голос
/ 25 января 2020

Расширение Shuffle недоступно для массивов. может быть, вам следует преобразовать его в список и затем перемешать, а затем преобразовать в массив

contentTitle = arrayOf(
                arrayOf(R.drawable.ic_fathah1_1, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_2, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_3, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_4, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_5, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_6, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_7, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_8, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_9, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_10, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_11, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_12, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_13, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_14, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_15, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_16, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_17, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_18, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_19, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_20, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_21, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_22, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_23, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_24, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_25, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_26, R.raw.ahem_x),
                arrayOf(R.drawable.ic_fathah1_27, R.raw.bad_disk_x),
                arrayOf(R.drawable.ic_fathah1_28, R.raw.baseball_hit),
                arrayOf(R.drawable.ic_fathah1_29, R.raw.bloop_x),
                arrayOf(R.drawable.ic_fathah1_30, R.raw.blurp_x),
                arrayOf(R.drawable.ic_fathah1_31, R.raw.ahem_x)
            ).asList().shuffled().toTypedArray()
1 голос
/ 25 января 2020

Преобразуйте ваш array в MutableList и затем перетасуйте список.

В вашем случае вместо непосредственного создания 2D-массива попробуйте создать MutableList, который содержит все ваши Int

var mutableList = mutableListOf(
            arrayOf(1,2,3,4),
            arrayOf(5,6,7,8),
            arrayOf(9,10,11,12),
            arrayOf(13,14,15,16))

массива. Если у вас есть MutableList, вы можете использовать функцию shuffle как

mutableList.shuffle()

. После перемешивания преобразовать массив MutableList в 2d, используя

 var arr = mutableList.toTypedArray()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...