Tableau d'ArrayList d'Être vivant
Fermé
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
-
Modifié par Étienne9 le 12/05/2013 à 17:55
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 13 mai 2013 à 18:40
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 13 mai 2013 à 18:40
A voir également:
- Tableau d'ArrayList d'Être vivant
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Trier tableau excel - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
3 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 12/05/2013 à 18:14
Modifié par KX le 12/05/2013 à 18:14
En Java la classe tableau est construite automatiquement et la classe ArrayList est générique, cette combinaison induit quelques restrictions de mise en oeuvre. Il faudra donc initialiser le tableau de listes, sans préciser le type générique EtreVivant qui n'est pas compréhensible par la génération du type tableau.
private ArrayList<EtreVivant>[] camp; this.camp = new ArrayList[nb];La confiance n'exclut pas le contrôle
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
12 mai 2013 à 18:16
12 mai 2013 à 18:16
J'ai des notes, ce n'est pas grave ?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
12 mai 2013 à 18:25
12 mai 2013 à 18:25
Des notes de quoi ?
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
12 mai 2013 à 18:31
12 mai 2013 à 18:31
Avec des insecure etc...
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
12 mai 2013 à 18:48
12 mai 2013 à 18:48
C'est normal, car il y a en effet un risque que le type ne soit pas le bon à l'exécution car on pourrait faire des trucs comme ça :
Evidemment ici, "camp" ne correspond plus à un ArrayList<EtreVivant>[] mais Java ne permet pas de garantir l'intégrité des données sur ce genre de code. D'où les avertissements.
Je te conseilles de déclarer ton tableau "camp" avec le mot clé "final" pour ne pas pouvoir modifier ton tableau comme je viens de le faire. Et d'explicitement indiquer à Java que le type de données qui a été déclaré est correct en faisant comme ceci :
ou
ArrayList<EtreVivant>[] camp; int nb=5; camp = new ArrayList[nb]; ArrayList[] tmp = { new ArrayList<Integer>(), new ArrayList<String>()}; tmp[0].add(1); tmp[1].add("a"); camp = tmp;
Evidemment ici, "camp" ne correspond plus à un ArrayList<EtreVivant>[] mais Java ne permet pas de garantir l'intégrité des données sur ce genre de code. D'où les avertissements.
Je te conseilles de déclarer ton tableau "camp" avec le mot clé "final" pour ne pas pouvoir modifier ton tableau comme je viens de le faire. Et d'explicitement indiquer à Java que le type de données qui a été déclaré est correct en faisant comme ceci :
@SuppressWarnings("unchecked") final ArrayList<EtreVivant>[] camp = new ArrayList[NB];
ou
final ArrayList<EtreVivant>[] camp; @SuppressWarnings("unchecked") public ConstructeurDeLaClasse(...) { ... camp = new ArrayList[nb]; ... }
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
Modifié par Étienne9 le 13/05/2013 à 10:10
Modifié par Étienne9 le 13/05/2013 à 10:10
Merci beaucoup :) Les deux sont pareils ? Pouvez-vous me rappeler ce qu'est le final svp ?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
13 mai 2013 à 18:40
13 mai 2013 à 18:40
Le mot-clé final interdit de réutiliser une même variable avec plusieurs valeurs différentes.
L'intérêt ici est de faire une déclaration dont on est sûr que tous les éléments seront des ArrayList<EtreVivant> et d'empêcher toute altération par la suite avec une affectation d'un ArrayList[] qui n'aurait rien à voir ("tmp" dans mon exemple) et qui provoquerait une erreur.
Mais il y a une contrainte à utiliser final, c'est que l'on doit lui affecter une valeur initiale. Donc là il y a plusieurs manières de faire et les deux méthodes que j'ai donné sont différentes.
1) On fait l'initialisation directement dans la classe. Mais cela suppose que "NB" est connu à l'avance. Et puisque le tableau est final, il ne sera pas possible de le redimensionner. Donc tous les objets de cette classe auront toujours un tableau de taille NB.
2) On fait l'initialisation dans un constructeur, cela permet de passer la valeur de "nb" en paramètre du constructeur et donc de s'adapter aux besoins de l'objet en particulier. Pour les mêmes raisons, il ne sera pas non plus possible de redimensionner le tableau plus tard.
Remarque : ces deux techniques sont assez lourdes et limitées, elles peuvent présenter un intérêt dans quelques cas bien précis, mais en général on privilégiera la création d'un autre type de collection à la place du tableau : un ArrayList<ArrayList<EtreVivant>>
Avec ou sans final, le "tableau" pourra être redimensionné vu que c'est une liste, et puisque le paramétrage de EtreVivant est bien précisé dans le constructeur on n'a plus besoin de @SuppressWarnings puisque Java peut vérifier tout seul que les objets ajoutés à "camp" sont bien des "ArrayList<EtreVivant>"
L'intérêt ici est de faire une déclaration dont on est sûr que tous les éléments seront des ArrayList<EtreVivant> et d'empêcher toute altération par la suite avec une affectation d'un ArrayList[] qui n'aurait rien à voir ("tmp" dans mon exemple) et qui provoquerait une erreur.
Mais il y a une contrainte à utiliser final, c'est que l'on doit lui affecter une valeur initiale. Donc là il y a plusieurs manières de faire et les deux méthodes que j'ai donné sont différentes.
1) On fait l'initialisation directement dans la classe. Mais cela suppose que "NB" est connu à l'avance. Et puisque le tableau est final, il ne sera pas possible de le redimensionner. Donc tous les objets de cette classe auront toujours un tableau de taille NB.
@SuppressWarnings("unchecked") final ArrayList<EtreVivant>[] camp = new ArrayList[NB];
2) On fait l'initialisation dans un constructeur, cela permet de passer la valeur de "nb" en paramètre du constructeur et donc de s'adapter aux besoins de l'objet en particulier. Pour les mêmes raisons, il ne sera pas non plus possible de redimensionner le tableau plus tard.
Remarque : ces deux techniques sont assez lourdes et limitées, elles peuvent présenter un intérêt dans quelques cas bien précis, mais en général on privilégiera la création d'un autre type de collection à la place du tableau : un ArrayList<ArrayList<EtreVivant>>
ArrayList<ArrayList<EtreVivant>> camp = new ArrayList<ArrayList<EtreVivant>>(nb);final n'est plus obligatoire, mais on peut le laisser quand pour protéger les données.
Avec ou sans final, le "tableau" pourra être redimensionné vu que c'est une liste, et puisque le paramétrage de EtreVivant est bien précisé dans le constructeur on n'a plus besoin de @SuppressWarnings puisque Java peut vérifier tout seul que les objets ajoutés à "camp" sont bien des "ArrayList<EtreVivant>"