Из того, что я мог бы извлечь из вашей картинки, я сделал три предположения:
- Значение numValue сгруппировано в группы по 13 элементов
- Каждая группа получает цвет в порядок: kirmizi -> siyah -> yesil -> mavi, затем он циклически повторяется
- Выделяемые идентификаторы циклически повторяются каждые 52 элемента
Исходя из этого, я придумал следующее решение:
data class Item(var color: String = "", var numValue: Int = -99, var drawableId: Int = -99)
fun main() {
val colors = listOf("kirmizi", "siyah", "yesil", "mavi")
val drawableIDs = (0..52).toList() // This is just a stub. in your case it will be your drawable lists
val edgeCase = arrayListOf(Item("sahte", drawableId = drawableIDs[0]), Item("sahte", drawableId = drawableIDs[0]))
val pattern = (0 until 104)
.map { index -> Pair(index, index / 13) }
.map { (index, group) ->
Item(
color = colors[group % 4],
numValue = index+1,
drawableId = drawableIDs[(index % 52) + 1]
)
}
val total = pattern + edgeCase
total.forEach { println(it) }
}
Вы можете поиграть с ним на этой kotlin детской площадке .
Есть ли более чистый способ сделать это ?
Исходя из того, что я понял, вы хотите инициализировать только первые 13 значений непрерывного массива с 28 пробелами, оставляя остальные либо с их значениями по умолчанию, либо с нулем.
Причина, по которой ваш код не работает, заключается в том, что инициализатор Array
ожидает, что вы вернете объект. сам по себе блок if
не является выражением в kotlin, поэтому он не оценивается как значение, поэтому для его работы необходимо предоставить ветвь else
.
val examples = Array(28) { if (i < 13) examples[i] else defaultExample }
Это указано в документации Kotlin для потока управления :
Если вы используете if как выражение, а не как оператор (например, возвращая его значение или присвоение его переменной), выражение должно иметь ветвь else.
Более простой вопрос
В этом случае вы можете просто использовать take :
// If you don't want to modify it
val player6 = testNumbers.take(10)
.toTypedArray() // Since take returns a List, you need to turn it back into an array
// If you want to modify the items
val player6 = testNumbers.take(10)
.map { value -> modifyNumber(value) }
.toTypedArray()
Подсказка: В kotlin, если вы объявите свой параметр конструктора с val
или var
они уже являются атрибутами вашего класса, и вам не нужно инициализировать вручную в блоке init
.
/*
* You don't need to do this:
* class Item(var color: String, var numValue: Int, var drawableId: Int) {
* init {
* this.color = color
* this.numValue = numValue
* this.drawableId = drawableId
* }
* }
*/
// Kotlin already does it for you
class Item(var color: String, var numValue: Int, var drawableId: Int)
fun main() {
val myitem = Item("blue", 20, 100)
println(myitem.color)
println(myitem.numValue)
println(myitem.drawableId)
}