[JAVA] ArrayList et multiples éléments

Fermé
EminoMeneko Messages postés 2435 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 - 25 oct. 2011 à 16:34
EminoMeneko Messages postés 2435 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 - 26 oct. 2011 à 02:25
Bonjour,
je suis en train de réfléchir à un petit projet perso dans le cadre de mon apprentissage de Java.
Je suis dans le cas où j'aimerais gérer plusieurs informations mais les ArrayList ne permettent la gestion que d'un seul élément.
En parcourant le Web on nous parle de faire un ArrayList d'ArrayList comme un tableau multi-dimensionnel est un tableau de tableau. C'est peut-être une bonne idée quand on a 2 dimensions mais ça me semble un peu lourd, surtout quand on doit gérer beaucoup d'éléments et que leur nombre peut évoluer.

Alors je me suis dit que peut-être je pouvais faire une ArrayList d'une Classe personnalisée que j'aurais utilisé un peut comme une structure en C/C++.

Une classe InfoImage qui pourra changer de taille si je veux ajouter des infos (EXIF par exemple)
+ chemin : String
+ extension : String
+ nomFichier : String
+ nHauteur : int
+ nLargeur : int
+ nPoids : double

Dans une autre classe je veux gérer ces informations dans une collection.
J'ai pensé à une ArrayList mais si vous estimez qu'il aurait fallu penser à un autre type de collection, je vous pries de bien vouloir motiver votre proposition.

Donc en l'état je pense utiliser un ArrayList <InfoImage> pour gérer ces multiples informations.
Qu'en pensez-vous ? Avez-vous une meilleure idée ?

J'en suis toujours à la phase de réflexion.
Je me pause encore d'autres questions pour obtenir une version exploitable mais ça n'a plus rien à voir avec cette question.

Merci d'avance à ceux qui pourront m'aider.

EminoMeneko
A voir également:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
25 oct. 2011 à 16:58
As-tu déjà entendu parler de ce que c'est qu'une classe ? De la programmation objet ?

Effectivement les ArrayList permettent de contenir un seul objet à chaque fois, mais celui-ci peut-être de n'importe quelle classe (donc InfoImage si tu veux), c'est d'ailleurs exactement pour faire ce genre de choses que sont faites les Collection...
Si on devait se contenter que des types élémentaires on n'irait pas bien loin.

Mais il n'y a pas que les ArrayList dans les Collection, il y a peut-être des conteneurs plus adaptés à tes besoins. Tout dépend ce que tu veux faire exactement.
0
EminoMeneko Messages postés 2435 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 318
Modifié par EminoMeneko le 25/10/2011 à 17:18
Oui je sais ce que sont les classes et la POO mais j'ai peu d'expérience pour ce qui touche à Java et ma connaissance de la POO est plutôt théorique ou sinon appliquée au C.C++. Si ça semble correct je vais pouvoir faire comme ça. Je veux juste maintenir une liste de fichiers image contenus dans un dossier pour pouvoir les exploiter par la suite.
Ce que je cherche à faire avec ce mini projet c'est mettre en pratique une théorie qui date un peu. Je ne voudrais pas tout mélanger et ça n'est pas le but pour le moment mais maintenant j'entends parler de Design Pattern et je trouve ça simple sur le principe mais dès qu'on rentre dans le détail ça devient un peu compliqué pour moi. Bref, je ne vais pas griller les étapes. Pour le moment je voudrait réfléchir à mon petit projet avant de passer à la phase de codage.
Merci.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
25 oct. 2011 à 17:28
Et bien tout dépend ce que tu veux faire comme traitement sur tes fichiers images.
Dans tous les cas c'est des Collection, donc il te faudra une classe pour les manipuler (ex: InfoImage)
Mais si les listes sont assez simples à utiliser parfois il est plus efficace d'utiliser d'autres types de Collection, regarde ce que sont les Set, Tree, ou Map.
0
EminoMeneko Messages postés 2435 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 318
25 oct. 2011 à 18:07
OK. En fait je souhaite remplir cette collection avec les données que j'aurais récupéré lors du parcours d'un dossier. Ensuite je veux afficher des images dynamiquement à partir de l'élément en cours.
En d'autres termes.
Parmi les infos que je veux stocker dans ma collection il y a le nom de fichier.
Donc en gros en ouvrant un dossier ou un fichier, je souhaite remplir cette fameuse collection avec l'ensemble des images valables dans cette même arborescence. Ensuite pour l'affichage je me base sur les informations récoltées pour allouer et libérer les ressources.
J'imagine bien que ça signifie un affichage des image peut-être un peu plus lent mais je préfère cette solution à celle que j'ai pu voir qui consiste à remplir un ArrayList avec les objets Image.
Imaginez qu'il y ait de très grosses images et/ou qu'elles soient nombreuses. Dois-je vraiment occuper autant de mémoire ?
Alors que les informations que je récolte sont infimes en taille par rapport aux images elles mêmes.
Une fois que la collection est remplie elle ne doit pas vraiment bouger beaucoup sauf si on décide de supprimer une ou plusieurs images.
Enfin bref je pense toujours aux ArrayList mais je dois continuer à lire le chapitre sur les collections.
Merci.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
25 oct. 2011 à 19:07
En Java l'allocation et la désallocation mémoire tu n'as pas à t'en occuper, il y a un ramasse-miettes (garbage collector) qui s'en occupe quand il a besoin de récupérer de la mémoire.
Tant que tu ne stockes que les informations sur les images, et pas leur contenu, ça devrait aller.
J'ai du mal à saisir en quoi consiste ton "affichage dynamique", et ton "ensemble d'images valables", peut-être veux-tu faire une visionneuse à la manière de Cooliris.
Le gros inconvénient des listes c'est que le parcours est linéaire, et que si l'accès aux extrémités sont très rapides, si tu veux accéder, ajouter, ou supprimer des valeurs en plein milieu, ce sera plus coûteux d'utiliser une liste qu'une HashSet par exemple. Le vrai avantage de la liste est de conserver l'ordre d'insertion des éléments mais je ne sais pas si c'est vraiment important dans ton cas.
Peut-être te faudra-t-il construire ta propre Collection en utilisant par exemple en cache des HashSet<Key,Collection<InfoImage>> pour accéder "immédiatement" à toutes les images qui correspondent à une certaine propriété. Par exemple une HashSet<Integer,List<InfoImage>> qui pour chaque nHauteur différente aura une liste de toutes les images de la hauteur spécifiée.
Ce serait vraiment parlant si tu faisais une recherche par mots clés où chaque image pourrait avoir plusieurs mots clés. Tu n'aurais alors pas à parcourir toutes tes images pour regarder si le mot-clé correspond, mais juste à appeler ta HashSet avec le mot clé correspondant.
Remarque : les objets ne seront pas dupliqués, tu travailleras sur des références, de même qu'en C/C++ tu travaillerais sur des pointeurs.
0
EminoMeneko Messages postés 2435 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 318
26 oct. 2011 à 02:25
C'est plutôt joli cooliris au vu de la capture d'écran proposée.
J'ai comme tout le monde mes mots à moi et par affichage dynamique je parle en fait simplement de charger l'image à partir des informations que je compte stocker. Donc en gros le dynamique n'en est peut-être pas tellement un pour le commun des mortels mais il s'agit simplement de charger l'image sélectionnée non pas depuis un tableau d'images mais depuis le disque et lors de l'affichage d'une autre image je pense libérer la ressource et allouer ce qu'il faut pour afficher l'image suivante.
Par image valables je parle des formats GIF, JPEG et PNG pour le moment. Je ne compte pas faire un logiciel complet mais juste une petite appli pour me faire la main. Vraiment ça doit rester très simple dans un premier temps. J'estime qu'une personne douée en Java pourrait torcher le projet en 20 minutes (d'ailleurs j'ai fait ça en C# le mois dernier ça prend 5 minutes à faire) sinon moins mais pour moi c'est pour le moment une autre paire de manches... xD
Enfin bref, on va adopter l'approche "pelure d'oignon" d'abord voir petit et ensuite compléter si il y a de nouvelles idées. Pas besoin de rechercher quoi que ce soit dans l'idée que je m'en fait pour le moment. Si on veut je cherche plutôt à faire une visionneuse d'image qui ressemble à celle de Windows. Vraiment un truc tout simple.
Merci.
0