Многомерный массив объектов в Котлине - PullRequest
2 голосов
/ 12 марта 2019

Я новичок в Kotlin и хочу создать многомерный массив пользовательского класса с разрешением null. Нечто подобное

private var array_map = arrayOf<Array<Obstacle?>>()

...

array_map[1][2] = Obstacle()

Как я могу это сделать? Спасибо!

Ответы [ 4 ]

2 голосов
/ 12 марта 2019

Вы можете использовать private var arrayMap: Array<Array<Obstacle?>> = arrayOf(). Просто оберните столько Array<>, сколько вам нужно.

2 голосов
/ 12 марта 2019

Не уверен, что это именно то, что вам нужно, но представьте, что Obstacle - это пользовательский класс с полем num, как показано ниже

data class Obstacle(var num: Int){}

2D-массив объекта Obstacle будет выглядеть следующим образом:

val array: Array<Obstacle?> = arrayOf(Obstacle(123), Obstacle(234))
val arrayOfArray: Array<Array<Obstacle?>> = arrayOf(array)
println(arrayOfArray[0][0]) // would print Obstacle(num=123)
println(arrayOfArray[0][1]) // would print Obstacle(num=234)

Итак, вы должны объявить свой 2D-массив, как показано ниже

val arrayOfArray: Array<Array<Obstacle?>> = arrayOf()
0 голосов
/ 20 июля 2019

Подход, который я всегда использую для этого случая:

arr2D = Array(sizeA) { Array(sizeB) { content } } 

Примечание. Я заменил размеры именами полей, чтобы проиллюстрировать, что каждое число / поле представляет ширину и высоту длины каждого измерения двумерного массива.

Кроме того, content следует заменить основным контентом, который вы хотите заполнить каждой координатой, в вашем случае кажется, что вы хотите настроить с Obstacle() экземплярами. Если вы хотите заполнить этот контент в другой момент, введите null или быстрый Any() справочник.

В последнем случае после создания вы можете просто выполнить установку itens:

arr2D[1][2] = Obstacle() 
0 голосов
/ 13 марта 2019

Ваш код будет скомпилирован как есть.Проблема в том, что размер массива нельзя изменить, и arrayOf<Array<Obstacle?>>() создает пустой массив, поэтому array_map[1][2] = Obstacle() завершается с ошибкой во время выполнения.(Если вы не наберете array_map = ... где-то между ними. Обратите внимание, что вы должны предпочесть val arrayMap, который не может быть переназначен, если у вас нет особых причин использовать var.)

Если вы хотите, чтобы вашДля массива, который начинается с нуля, в стандартной библиотеке есть arrayOfNulls, но он создает только одномерный массив, и вам действительно нужен массив массивов нулей.Вы можете написать вспомогательную функцию:

inline fun <reified T> matrixOfNulls(n: Int, m: Int) = Array(n) { arrayOfNulls<T>(m) }

private val arrayMap = matrixOfNulls<Obstacle>(5, 5) // example arguments
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...