web-dev-qa-db-fra.com

Tableaux multidimensionnels de différentes tailles

J'ai juste eu une idée pour tester quelque chose et cela a fonctionné:

    String[][] arr = new String[4][4];

    arr[2] = new String[5];

    for(int i = 0; i < arr.length; i++)
    {
        System.out.println(arr[i].length);
    }

La sortie est évidemment:

4
4
5
4

Donc mes questions sont:

  • Est-ce un bon ou un mauvais style de codage?
  • Pour quoi cela pourrait-il être bon?
  • Et surtout, existe-t-il un moyen de créer une telle construction dans la déclaration elle-même?
  • Aussi ... pourquoi est-il même possible de le faire?
14
Loki
  • Est-ce un bon ou un mauvais style de codage?

Comme n'importe quoi, cela dépend de la situation. Il y a des situations où tableaux déchiquetés (comme on les appelle) sont en fait appropriés.

  • Pour quoi cela pourrait-il être bon?

Eh bien, pour stocker des ensembles de données de différentes longueurs dans un tableau. Par exemple, si nous avions les chaînes "hello" et "goodbye", nous pourrions vouloir stocker leurs tableaux de caractères dans une structure. Ces tableaux de caractères ont des longueurs différentes, nous utiliserions donc un tableau en dents de scie. 

  • Et surtout, existe-t-il un moyen de créer une telle construction dans la déclaration elle-même?

Oui:

char[][] x = {{'h','e','l','l','o'},
              {'g','o','o','d','b','y','e'}};
  • Aussi ... pourquoi est-il même possible de le faire?

Parce que cela est autorisé par la spécification du langage Java, §10.6 .

20
arshajii
  1. C'est un bon style de codage, il n'y a rien de mal à cela. J'ai moi-même créé des tableaux dentelés pour différents problèmes par le passé.

  2. C'est bien parce que vous pourriez avoir besoin de stocker des données de cette façon. Les données stockées de cette manière vous permettraient d’économiser de la mémoire. Ce serait un moyen naturel de mapper des éléments plus efficacement dans certains scénarios.

  3. En une seule ligne, sans remplir explicitement le tableau? C'est la chose la plus proche à laquelle je puisse penser.

    int[][] test = new int[10][];
    test[0] = new int[100];
    test[1] = new int[500];
    

    Cela vous permettrait de renseigner les lignes avec des tableaux de différentes longueurs. Je préfère cette approche pour renseigner des valeurs telles que:

    int[][] test = new int[][]{{1,2,3},{4},{5,6,7}};
    

    Parce qu'il est plus lisible et pratique à taper lorsqu'il s'agit de grands tableaux déchiquetés.

  4. Son possible pour les raisons données dans 2. Les gens ont des raisons valables d'avoir besoin de tableaux déchiquetés, alors les créateurs de la langue nous ont donné le moyen de le faire.
10
William Morrison

(1) Bien que rien ne soit techniquement/fonctionnellement/syntaxiquement incorrect avec cela, je dirais que c'est un mauvais style de codage car il rompt l'hypothèse fournie par l'initialisation de l'objet (String [4] [4]). Ceci, finalement, dépend de la préférence de l'utilisateur; si vous êtes le seul à le lire et que vous savez exactement ce que vous faites, tout ira bien. Si d'autres personnes partagent/utilisent votre code, cela crée de la confusion.

(2) Le seul concept auquel je pouvais penser était si vous aviez plusieurs tableaux à lire, mais que vous n'en connaissiez pas la taille auparavant. Cependant, il serait plus logique d'utiliser ArrayList<String> dans ce cas, à moins que les frais généraux ajoutés ne soient une affaire sérieuse.

(3) Je ne suis pas sûr de ce que vous demandez ici. Voulez-vous dire, pouvez-vous en quelque sorte spécifier des longueurs de tableau individuelles dans cette déclaration initiale? La réponse à cette question est non.

(4) Il est possible d'étendre et de réduire les longueurs de tableaux primitifs, car en coulisse, vous allouez et libérez des morceaux de mémoire.

1
Deactivator2