Зачем использовать массив более двух измерений? - PullRequest
2 голосов
/ 26 октября 2009

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

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

Пол: Мужской | Женский
Цвет волос: светлые | Брюнетка | Черный
Цвет глаз: синий | Коричневый | Зеленый | Хейзел

Instinct говорит мне, что я должен создать массив следующим образом:

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

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

Ответы [ 6 ]

8 голосов
/ 26 октября 2009

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

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

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

double[,,,] responseTime = new double [12,20,10,3];
8 голосов
/ 26 октября 2009

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

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

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

2 голосов
/ 26 октября 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;
};

и т.д ...

1 голос
/ 26 октября 2009

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

123 Main St Springfield MA

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

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

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

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

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

1 голос
/ 26 октября 2009

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

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

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

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
   }
}
0 голосов
/ 26 октября 2009

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

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

...