2009-10-25 2 views
2

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

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

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

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

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

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

ответ

8

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

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

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

double[,,,] responseTime = new double [12,20,10,3]; 
+1

Примечание. C# поддерживает «зубчатые» массивы, объявленные в форме double [] [] [] [] arrayName. Это, например, позволит вам иметь различное количество людей в месяц, различное количество тестов на человека в каждом месяце и т. Д. Однако такие массивы медленнее индексируются. – Artelius

1

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

Поскольку категории данных в вашем примере (пол, цвет глаз, цвет волос) не имеют отношения к другим категориям, кажется, что это было бы лучше всего представлено как 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 
    } 
} 
+0

* больше * чем два? – Artelius

+0

Больше чем 2 что? –

8

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

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

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

+0

правый, не банально. – hplbsh

2

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

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

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

123 Main St Springfield MA

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

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

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

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

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

+0

Как ни странно, мой отец работал очень близко к вашему примеру. Правдивая история. –

0

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

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

Смежные вопросы