2009-10-25 12 views
2

J'ai de la difficulté à faire le tour du concept de tableau à plus de deux dimensions, de la raison pour laquelle vous en auriez besoin et de la façon dont vous l'utiliseriez.Pourquoi utiliser un tableau de plus de deux dimensions?

Par exemple, comment représenteriez-vous les données suivantes dans un tableau multidimensionnel?

Sexe: Masculin | Femme
Couleur des cheveux: Blond | Brunette | Noir
Couleur des yeux: Bleu | Brown | Vert | Hazel

Instinct me dit que je devrais créer un tableau comme si:

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

S'il vous plaît montrer comment vous vous remplir ce tableau sans une boucle, puis avec une boucle. Toute expansion sur les concepts et l'utilisation appréciée.

Répondre

8

Je ne vais pas toucher votre personAttributes exemple parce que je ne pense pas que 2D array est une bonne idée, sans parler de 3D (personnellement j'utiliserais un tableau de structures). Toutefois, les tableaux multidimensionnels sont très utiles lorsque vous disposez d'une sorte d'espace de données orthogonales (c'est-à-dire que vous avez plusieurs «choix» indépendants les uns des autres). Par exemple, si vous stockez les temps de réponse de 20 personnes sur 10 tests, où chaque test est répété 3 fois, et le tout est fait une fois par mois pendant 12 mois, vous pourriez avoir un tableau comme celui-ci :

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

Remarque, C# prend en charge les tableaux "dentelés", déclarés sous la forme double [] [] [] [] arrayName. Cela vous permettrait par exemple d'avoir un nombre différent de personnes par mois, un nombre différent de tests par personne dans chaque mois, et ainsi de suite. Toutefois, ces tableaux sont plus lents à indexer. – Artelius

1

Pour modéliser des structures de données à dimensions multiples. Un échiquier est un bon exemple, 1 dimension est pour le rang, l'autre pour le fichier. Puisque les catégories de données dans votre exemple (sexe, couleur des yeux, couleur des cheveux) n'ont aucune relation avec les autres catégories, il semble que ce soit mieux représenté comme 3 tableaux différents, chacun avec 1 dimension.

Si vous voulez faire une boucle sur un tableau de dimensions multiples, vous utilisez simplement une boucle dans une boucle:

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

* plus de deux? – Artelius

+0

Plus de 2 quoi? –

8

Au risque de sembler banal, vous utilisez des tableaux de trois dimensions ou plus lorsque vous avoir trois dimensions ou plus de données. Donc je suppose que vous avez du mal à envisager trois dimensions de données.

Que diriez-vous de 3-D Tic Tac Toe? Toute représentation discrète de données tridimensionnelles entre dans cette catégorie.

En ce qui concerne les attributs comme la couleur des cheveux et ainsi de suite, je ne voudrais pas utiliser un tableau multidimensionnel pour cela. Utilisez des objets avec des propriétés pour cela et enums (par exemple, le genre comme une énumération) selon le cas. Ce sera beaucoup plus lisible qu'un tableau N-dimensionnel.

+0

droit, pas banal. – hplbsh

2

Je dirais dans votre exemple qu'un tableau multidimensionnel n'a pas de sens. Une classe a beaucoup plus de sens dans votre situation. Quelque chose comme une énumération stockée en tant que variable membre serait une façon que vous pouvez aller:

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; 
}; 

etc ...

1

Penser un tableau comme une adresse peut être utile.

123 Main St Springfield MA

En utilisant cet exemple, mon premier tableau serait un tableau d'états. Chaque état contient une série de villes, les villes contiennent des rues et enfin les rues contiennent des adresses individuelles.

Avec ce tableau, nous pourrions facilement créer une liste de diffusion avec chaque adresse. Parcourez simplement chaque tableau et vous pourrez imprimer chaque adresse ou tout ce que vous devez faire.

En regardant votre exemple, je ne vois pas les tableaux multidimensionnels comme un bon ajustement. À moins que la principale chose que vous voulez faire avec vos tableaux est de trouver des sous-ensembles de vos données, comme les personnes qui sont des yeux féminins/blonds/bleus. Je suivrais la suggestion d'utiliser un cours. Lorsque vous regardez un objet personne dans un tableau, vous devez connaître les valeurs d'index pointant vers cette personne pour comprendre ces caractéristiques.

Un autre exemple qui pourrait être utile est l'internationalisation des messages dans une application. Les tableaux peuvent être la langue, l'état (erreur, avertissement, info), l'identifiant de message (une chaîne de message de tableau). En ce qui concerne le remplissage des baies, seules quelques boucles pourraient être utilisées si les données étaient triées. Sinon, analyser vos données d'entrée pour identifier les indices appropriés.

+0

Assez bizarrement, mon père travaillait très près de votre adresse d'exemple. Histoire vraie. –

0

Comme d'autres l'ont écrit, votre exemple ne convient pas à un tableau 3D. Votre exemple semble plus approprié à une structure de données 2D. Un index est des personnes, l'autre index est la caractéristique: le sexe, la couleur des cheveux, la couleur des yeux. Ou vous pouvez utiliser une autre structure de données ...

Un exemple simple de tableau 3D: envisager de stocker un film numérique blanc (non compressé) & noir. Chaque image est une image 2D X vs Y avec des valeurs d'intensité: image (i, j). Maintenant, pour avoir plusieurs images pour avoir un film, vous pouvez stocker le film sous forme d'images (i, j, k), où k change avec le temps. Si le film était en couleur, vous pourriez ajouter une quatrième dimension pour stocker trois couleurs primaires: cimages (i, j, q, k), q = 1,2,3, et avoir un tableau 4D.

Questions connexes