web-dev-qa-db-fra.com

Les attributs x, y et row, col d'un tableau à deux dimensions sont-ils inversés?

si je pense au plan de coordonnées x, y x, y est la notation commune pour une paire ordonnée, mais si j'utilise un tableau à deux sous, j'ai monArray [row] [col] et row est le y et col est le x . Est-ce à l'envers ou est-ce que j'y pense juste mal? Je pensais que cela ressemblerait à myArray [x] [y] mais c'est faux si je veux de vraies lignes et colonnes (comme dans un plateau de jeu.) Ne serait-ce pas myArray [y] [x] pour vraiment imiter un tableau de colonnes de ligne ?

41
johnny

Vous avez raison, et cela semble un peu en arrière. le numéro de ligne est une coordonnée y et le numéro de colonne est une coordonnée x, et pourtant nous écrivons généralement ligne, col mais nous écrivons également généralement x, y.

Que vous souhaitiez écrire votre tableau en tant que [y] [x] dépend ou [x] [y] dépend principalement de combien vous vous souciez réellement de la disposition en mémoire (et si vous le faites, quelle langue vous utilisez). et si vous voulez écrire des fonctions/méthodes qui peuvent fonctionner isolément sur des lignes ou des colonnes.

Si vous écrivez du code C/C++, les tableaux sont stockés dans Row Major Order ce qui signifie qu'une seule ligne de données peut être traitée comme un tableau à 1 dimension. Mais une seule colonne de données ne le peut pas. Si je me souviens bien, VB utilise l'ordre principal des colonnes, donc les langues varient. Je serais surpris que C # ne soit pas également l'ordre principal des lignes, mais je ne sais pas.

36
John Knoeller

Voici ce que je fais pour ma propre raison:

int x = array[0].length;
int y = array.length;

Et puis pour chaque appel de tableau que je fais, j'écris:

array[y][x]

Ceci est particulièrement utile pour les algorithmes graphiques et le retournement de matrice horizontal/vertical.

4
wild_nothing

Peu importe comment vous stockez vos données dans le tableau ([x] [y] ou [y] [x]). Ce qui importe, c'est que vous bouclez toujours sur le tableau de manière contiguë. A Java tableau bidimensionnel est essentiellement un tableau unidimensionnel stockant le deuxième tableau (par exemple, dans le cas de [y] [x] vous avez un long tableau de [y] dans lequel chaque y contient les tableaux [x] correspondants pour cette ligne de y).

Pour parcourir efficacement l'ensemble du tableau, il est important d'accéder aux données de manière à ce que vous n'ayez pas à effectuer de recherches en continu dans ce tableau, en passant d'un tableau y de x-tableaux à un autre tableau y de xarrays. Ce que vous voulez faire est d'accéder à un élément y et d'accéder à tous les x qui s'y trouvent avant de passer à l'élément y suivant.

Donc dans une situation Array [y] [x]. ont toujours la première variable dans la boucle externe et la seconde dans la boucle interne:

for (int ys = 0; ys < Array.length; ys++)
    for (int xs = 0; xs < Array[y].length; xs++)
    {
        do  your stuff here
    }

Et bien sûr, pré-allouez les deux longueurs de tableau hors de la boucle pour éviter d'avoir à obtenir ces valeurs à chaque cycle.

4
MacD

En fait, cela dépend de vous. Il n'y a pas de droit de penser dans votre question. Par exemple, je pense généralement à un tableau à une dimension comme une rangée de cellules. Donc, dans mon esprit, c'est array [col] [row]. Mais cela dépend vraiment de vous ...

0
anthares

Je parie qu'il y a beaucoup d'opinions divergentes sur celui-ci. En bout de ligne, cela n'a pas vraiment d'importance tant que vous êtes cohérent. Si vous avez d'autres bibliothèques ou similaires qui utiliseront les mêmes données, il peut être judicieux de faire ce qu'elles font pour une intégration plus facile.

Si cela est strictement dans votre propre code, faites tout ce qui vous convient. Ma préférence personnelle serait d'utiliser myArray [y] [x]. S'ils sont volumineux, il peut être avantageux de conserver ensemble les éléments auxquels vous allez accéder en même temps. Mais je ne m'inquiéterais pas à ce sujet jusqu'à très tard, voire pas du tout.

0
villintehaspam

Eh bien pas vraiment, si vous pensez à une ligne comme des éléments sur l'axe des x et qu'un tableau 2D est un groupe d'éléments de ligne sur l'axe des y, alors il est normal d'utiliser y pour fonctionner sur une ligne, comme vous le savez déjà, le x (pour cette ligne particulière x est toujours le même, c'est y qui change avec ses indices), puis utilisez x pour opérer sur les éléments de plusieurs lignes (les lignes sont empilées verticalement, chacune à une valeur y particulière)

0
Shivan Dragon