Многомерный массив на Цейлоне

Я хотел бы работать на Цейлоне с многомерным массивом. Это планируется на Цейлоне? Если так, как я могу это объявить?

Я хотел бы использовать эту конструкцию на Цейлоне, как показано здесь на Java:

int x = 5;
int y = 5;

String[][] myStringArray = new String [x][y];

myStringArray[2][2] = "a string";

2 ответа

Во-первых, подумайте, действительно ли вам нужен массив (то есть что-то с фиксированной длиной и изменяемыми элементами), или же список (или список списков) или карта могут быть лучше. Хотя из вашего примера вам, кажется, нужна модификация.

В JVM "многомерный" массив - это просто массив массивов.

В Java new String[y] создает массив, заполненный null записи, что не является допустимым значением типа String на Цейлоне. Таким образом, вы можете иметь массив String? (который позволяет null), или предварительно заполните ваш массив другим значением, используя, например, Array.ofSize (...):

Array.ofSize(y, "hello")

То же самое относится к массивам массивов. Мы могли бы сделать это:

value myStringArray = Array.ofSize(x, Array.ofSize(y, "hello"));

Хотя это будет иметь один и тот же массив в каждой "строке" 2D-массива, а это не то, что мы хотим (как замена myStringArray[2][2] заменит все записи с 2 в качестве второй координаты). Здесь полезен другой конструктор Array, который требует итерации:

value myStringArray = Array({ Array.ofSize(y, "hello") }.repeat(x));

Это использует тот факт, что итеративное перечисление вычисляет свои аргументы лениво, и, таким образом, конструктор массива получит х различных элементов.

Мне нравится ответ Пауло, но вот альтернативный подход, который позволяет нам использовать понимание для заполнения 2D-массива:

//the size of the square 2D array
value n = 5;

//create it using a nested comprehension
value arr = Array { 
    for (i in 1..n-1) Array { 
        for (j in 0..n-1) 
            i==j then 1 else 0 
    }
};

//display it
for (row in arr) {
    printAll(row);
}
Другие вопросы по тегам