В С# концепция многомерных матриц довольно крутая. Но я не понимаю, когда их использовать. Как и в каких типах приложений эта концепция используется.
Не звучать банально, но вы используете многомерные массивы, когда у вас многомерные данные.
Матрицы - общий пример, но это может быть так же легко, как игровая доска (например, Шахматы), или как модель данных для N-мерного лабиринта или таллинга или что-то действительно.
Одним из распространенных применений является матрица.
В качестве бокового пункта вы можете использовать многомерные массивы (int [,]) или зубчатые массивы (int [] []). Первый может быть инициализирован за один шаг, но требует большего непрерывного блока памяти и медленнее для доступа, в то время как последний более удобен для памяти, так как суб-массивы могут быть распределены по адресному пространству, каждая подматрица может быть другая длина, и все одномерные массивы (SZarrays) имеют специальную оптимизацию в CLR. Однако вам необходимо инициализировать каждый размер отдельно с помощью зубчатых массивов:
int[][] jagged = new int[5][];
for (int i=0; i<jagged.Length; i++)
{
jagged[i] = new int[10]; // length can be different for each sub-array, if needed
}
многомерные массивы инициализируются сразу
int[,] mArray = new int[5,10];
Представьте, что вы хотите запрограммировать игру в шахматы. Как вы представляете плату с одномерным массивом?
Хорошим примером 2-мерного массива будет растровое изображение. Представьте, что каждый пиксель в изображении занимает один блок массива Pixel[1024][768]
. Итак, чтобы узнать, какой цвет пиксел в верхнем левом углу экрана, вы бы посмотрели на Pixel[0][0]
.
3-мерные массивы требуют большей визуализации, но классическим примером будут моделирование точек в пространстве.
Я использовал двумерный массив в быстром и грязном симуляторе Hold 'Em, который я написал для представления решений на префлопе, это выглядело примерно так:
_Open = new char[][]
{ // 2 3 4 5 6 7 8 9 T J Q K A
new char [] {'P', 'F', 'F', 'F', 'F','F','F','F','F','F','F','P','P'}, // 2
new char [] {'F', 'P', 'F', 'F', 'F','F','F','F','F','F','F','P','P'}, // 3
new char [] {'F', 'F', 'P', 'F', 'F','F','F','F','F','F','F','P','P'}, // 4
new char [] {'F', 'F', 'F', 'P', 'F','F','F','F','F','F','F','P','P'}, // 5
new char [] {'F', 'F', 'F', 'F', 'P','F','F','F','F','F','F','P','P'}, // 6
new char [] {'F', 'F', 'F', 'F', 'F','P','F','F','P','F','F','P','P'}, // 7
new char [] {'F', 'F', 'F', 'F', 'F','F','P','P','P','P','F','P','P'}, // 8
new char [] {'F', 'F', 'F', 'F', 'F','F','F','P','P','P','P','P','P'}, // 9
new char [] {'F', 'F', 'F', 'F', 'F','F','F','F','P','P','P','P','P'}, // T
new char [] {'F', 'F', 'F', 'F', 'F','F','F','F','F','P','P','P','P'}, // J
new char [] {'F', 'F', 'F', 'F', 'F','F','F','P','P','P','P','P','P'}, // Q
new char [] {'P', 'P', 'P', 'P', 'P','P','P','P','P','P','P','P','P'}, // K
new char [] {'P', 'P', 'P', 'P', 'P','P','P','P','P','P','P','P','P'} // A
};
Использование 0 для представления 2 и 12 для представления Ace. Поэтому, если симулятор обнаружит Ace, King, он будет проверять _Open [12] [11], см. "P" (что означает "push" или "all-in" ) и действовать соответственно
Этот фрагмент Java может просветить вас... он читает файл в двумерный массив. Это часть моего решения MazeOfBolton (google it).
/**
* Reads the file into a char[rows][cols] matrix.
* @param String filename - the name of the file to read
* @return a two-dimensional array of chars containing file contents.
*/
private static char[][] readMatrix(String filename) throws IOException {
BufferedReader input = null;
try {
input = new BufferedReader(new FileReader(filename));
List<String> lines = new ArrayList<String>();
String line = null;
while ( (line = input.readLine()) != null ) {
lines.add(line);
}
int rows = lines.size();
char[][] matrix = new char[rows][];
for (int i=0; i<rows; i++) {
matrix[i] = lines.get(i).toCharArray();
}
return matrix;
} finally {
if(input!=null)input.close();
}
}
EDIT: Я должен сказать почему Я использовал матрицу... тем более, что мне пришлось создать список, чтобы получить массив... А? Почему бы просто не использовать Список? Короткий ответ скорость.
Доступ к массиву (хотя и многих измерений) реализуется (под капотом) как "арифметика индекса" (так называемая арифметика указателя), поэтому он не только обращается к элементу массива O (1), он быстрый O (1)... намного быстрее, чем эквивалентный arrayList.get(int index) (когда вы делаете это пару - миллион раз)... и в (допустимо искусственном) мире алгоритмических гонок скорость - это все.
Приветствия. Кит.
Хотя я уверен, что другие могут предоставить множество разных примеров, я работаю с роботами, и один из многих роботов задач выполняет пакетирование, помещая элемент в строку и формирование столбцов на поддоне. Каждое место на поддоне представляет собой набор индексов 2 или даже 3 размера массива.
locationArrayt [строка, столбец]
Мы также используем их для многоязычных приложений. Массив строк представляет собой различные сообщения об ошибках, второй - язык.
сообщение [errorNumber, язык]