Многомерный массив, судя по самому названию, представляет собой массив, содержащий более одного измерения. 2d и 3d массивы являются наиболее распространенными, которые вы можете найти. Двухмерные массивыдля таких языков, как Ruby и Javascript, будутмассивом массивов. Но следует отметить, что эти языки не поддерживают истинный смысл многомерных массивов. Разница заключается в его распределении памяти.
В истинном MDA все его элементы занимают непрерывный блок памяти, совсем как матрица со своими строками и столбцами.
Массив массивов (AoA) несколько иначе занимает память. A вместо того, чтобы занимать блок в памяти, будет содержать ссылку на его элементы, которые представляют собой массивы, содержащие ссылки на содержащиеся в них элементы.
2D-массивы
Двумерные массивы в Ruby представлены массивом одномерных массивов.
[[1,4,7][2,5,8][3,6,9]]
Эта структура данных удобна для программирования игр, требующих сетки, которые содержат строки (X) и столбцы (Y), такие как шахматы, судоку и т. д.
board = [[1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9]]
Доступ к каждой из этих строк довольно прост. Мы можем просто пройтись по основному массиву, содержащему каждый из них. Но что, если нам нужно получить доступ к элементам на «оси Y»? (например: [1,1,1,1,1,1,1,1,1], [2,2,2,2,2,2,2,2,2] и т. д.)
К счастью, в Ruby есть специальный метод под названием transpose, который упрощает задачу.
output = board.transpose output = [[1,1,1,1,1,1,1,1,1], [2,2,2,2,2,2,2,2,2], [3,3,3,3,3,3,3,3,3], [4,4,4,4,4,4,4,4,4], [5,5,5,5,5,5,5,5,5], [6,6,6,6,6,6,6,6,6], [7,7,7,7,7,7,7,7,7], [8,8,8,8,8,8,8,8,8] [9,9,9,9,9,9,9,9,9]]
Вот разбивка того, как работает метод транспонирования:
def my_transpose(board) new_matrix = [] i = 0 while i < board.size new_matrix[i] = [] j = 0 while j < board.size new_matrix[i] << board[j][i] j += 1 end i += 1 end puts “Here are the columns to be checked! #{new_matrix}” return new_matrix end
Это позволяет вам собирать каждый элемент с одинаковой позицией в разных строках. Каждая из этих коллекций подмассивов затем помещается в основной массив, предоставляя вам массив «столбцов» для использования.