Зачем использовать массив из более чем двух измерений?

У меня возникли проблемы с пониманием концепции массива с более чем двумя измерениями, зачем он вам нужен и как вы его будете использовать.

Например, как бы вы представили следующие данные в многомерном массиве?

Пол: мужской | Женщина
Цвет волос: Блондинка | Брюнетка | Черный
Цвет глаз: Синий | Браун | Зеленый | Хейзел

Инстинкт говорит мне, что я должен создать массив так:

string[,,] personAttributes = new string[2,3,4]

Пожалуйста, покажите, как бы вы заполнили этот массив без цикла, а затем с циклом. Любое расширение концепций и использования приветствуется.


person Sci-fi    schedule 25.10.2009    source источник


Ответы (7)


Я не собираюсь касаться вашего примера с атрибутами personAttributes, потому что я не думаю, что 2D-массив — хорошая идея, не говоря уже о 3D (лично я бы использовал массив структур).

Однако многомерные массивы очень полезны, когда у вас есть какое-то ортогональное пространство данных (т.е. у вас есть несколько «выборов», которые не зависят друг от друга).

Например, если вы храните время отклика 20 человек по 10 тестам, где каждый тест повторяется 3 раза, и все это делается раз в месяц в течение 12 месяцев, у вас может быть такой массив:

double[,,,] responseTime = new double [12,20,10,3];
person Artelius    schedule 25.10.2009
comment
Обратите внимание, C# поддерживает зубчатые массивы, объявленные в форме double[][][][] имя_массива. Это, например, позволит вам иметь разное количество людей в месяц, разное количество тестов на человека в каждом месяце и так далее. Однако такие массивы медленнее индексируются. - person Artelius; 26.10.2009

Рискуя показаться банальным, вы используете массивы из трех или более измерений, когда у вас есть три или более измерений данных. Итак, я думаю, у вас возникли проблемы с представлением трех измерений данных.

Как насчет трехмерных крестиков-ноликов? Любое дискретное представление трехмерных данных подходит под эту категорию.

Что касается таких атрибутов, как цвет волос и т. д., я бы не стал использовать для этого многомерный массив. Используйте объекты со свойствами для этого и перечисления (например, пол как перечисление) по мере необходимости. Это будет намного читабельнее, чем N-мерный массив.

person cletus    schedule 25.10.2009

Я бы сказал, что в вашем примере многомерный массив не имеет смысла. Класс имеет гораздо больше смысла в вашей ситуации. Что-то вроде перечисления, хранящегося как переменная-член, было бы одним из способов, которым вы могли бы пойти:

enum HAIRCOLORS { BROWN = 0, BLOND = 1 ..... };
enum SEX { FEMALE = 0, MALE = 1 };
enum EYECOLORS { GREEN, BLUE, RED .... };

class PersonAttributes 
{
    public SEX sex = SEX.Female;
    public HAIRCOLORS hairColor = HAIRCOLORS.Brown;
    public EYECOLORS eyeColor = EYECOLORS.Green;
};

и т.д...

person Polaris878    schedule 25.10.2009

Для моделирования структур данных, которые имеют несколько измерений. Хорошим примером является шахматная доска, одно измерение для ранга, другое для файла.

Поскольку категории данных в вашем примере (пол, цвет глаз, цвет волос) не имеют отношения к другим категориям, кажется, что это лучше всего представить в виде 3 разных массивов, каждый из которых имеет 1 измерение.

Если вы хотите зациклиться на многомерном массиве, вы просто используете цикл внутри цикла:

for (int i = 0; i < array.length; i++) {
   for (int j = 0; j < array[0].length; j++) {
      string data = array[i][j];
      // do something with the data
   }
}
person Kaleb Brasee    schedule 25.10.2009

Думать о массиве как об адресе может быть полезно.

123 Мейн-Стрит Спрингфилд, Массачусетс

Используя этот пример, мой первый массив будет массивом состояний. Каждый штат будет содержать множество городов, затем города содержат улицы и, наконец, улицы содержат отдельные адреса.

С помощью этого массива мы могли бы легко создать список рассылки с каждым адресом. Просто переберите каждый массив, и вы сможете распечатать каждый адрес или все, что вам нужно сделать.

Глядя на ваш пример, я не вижу подходящих многомерных массивов. Если главное, что вы хотите сделать с вашими массивами, — это найти подмножества ваших данных, например, людей женского пола / блондинов / голубоглазых. Я бы последовал предложению использовать класс. Когда вы смотрите на объект человека в массиве, вам нужно знать значения индекса, указывающие на этого человека, чтобы выяснить эти характеристики.

Другой полезный пример — интернационализация сообщений в приложении. Массивы могут быть языком, состоянием (ошибка, предупреждение, информация), идентификатором сообщения (массив строк сообщения).

Что касается заполнения массивов, то можно было бы использовать всего несколько циклов for, если бы данные были отсортированы. В противном случае проанализируйте ваши входные данные, чтобы определить соответствующие индексы.

person Philip Tinney    schedule 26.10.2009
comment
Как ни странно, мой папа работал очень близко к вашему примерному адресу. Правдивая история. - person Jesse C. Slicer; 26.10.2009

Как писали другие, ваш пример не очень подходит для трехмерного массива. Ваш пример кажется более подходящим для 2D-структуры данных. Один индекс - лица, другой - характеристики: пол, цвет волос, цвет глаз. Или вы можете использовать какую-то другую структуру данных...

Простой пример 3D-массива: хранение (несжатого) черно-белого цифрового фильма. Каждый кадр представляет собой 2D-изображение X vs Y со значениями интенсивности: изображение (i,j). Теперь, чтобы иметь несколько кадров для фильма, вы можете сохранить фильм в виде изображений (i, j, k), где k меняется со временем. Если бы фильм был цветным, вы могли бы добавить четвертое измерение для хранения трех основных цветов: изображений (i, j, q, k), q = 1,2,3 и иметь массив 4D.

person M. S. B.    schedule 26.10.2009

Самый простой способ понять многомерный массив — признать каждый массив одномерным массивом. т. е. трехмерный массив представляет собой одномерный массив, а каждый элемент в одномерном массиве представляет собой двумерный массив.

сбивает с толку........?

см. этот пример

Здесь оценки учащегося по имени ABC на двух экзаменах, проводимых в один и тот же год, отображаются в виде двумерного массива. по предмету.

теперь, когда есть только один ученик, легко создать двумерный массив, но если вам нужно хранить оценки трех учеников с именами ABC, DEF, GHI, вы не можете сделать это в двумерном массиве. для этого я создам одномерный массив, в котором смогу хранить данные каждого ученика в отдельности.

упрощенный.....

Я буду хранить двумерный массив, содержащий данные каждого ученика, в одномерном массиве, и теперь этот одномерный массив представляет собой трехмерный массив.

Здесь массив классов — это трехмерный массив

Точно так же 4-мерный массив также является 1-мерным массивом, где каждый элемент этого массива является 3-мерным массивом.

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

person Saurabh Singh    schedule 12.10.2020