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
Bonjour à tous,

J'ai besoin de faire un tableau d'ArrayList de type Être Vivant (une classe que j'ai créée).
Le problème c'est que la déclaration de la variable passe avec:
private ArrayList <EtreVivant> camp[];

Mais l'initialisation de la taille de mon tableau avec ceci ça ne marche pas :
this.camp = new ArrayList<EtreVivant>[nb];

Quelqu'un peut m'aider s'il vous plaît ?

Vous risquez de me demander pourquoi je fais un tableau de listes ? C'est tout simple, c'est que un camp contient plusieurs êtres vivants et si je veux les êtres vivants du camp numéro 2 par exemple j'ai juste à parcourir la liste camp[2] et comme le nombre de camp est statique (ne peut pas être modifié en cours d'exécution) alors voilà....

Cordialement.
A voir également:

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
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
0
É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
J'ai des notes, ce n'est pas grave ?
0
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
Des notes de quoi ?
0
É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
Avec des insecure etc...
0
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
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 :

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];
    ...
}
0
É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
Merci beaucoup :) Les deux sont pareils ? Pouvez-vous me rappeler ce qu'est le final svp ?
0
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
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.

@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>"
0