Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2566 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Résolu - Arrayliste, exemple COMPLET

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Résolu - Arrayliste, exemple COMPLET

n°1596890
Kiosquec
Posté le 07-08-2007 à 19:06:10  profilanswer
 

Je recherche désespérément un exemple complet (ça veut dire copier-coller = ça marche sans rien rajouter) d'une ArrayList qui fonctionne.
Et surtout qui ne se contente pas de montrer comment la remplir et de renvoyer à la javadoc pour essayer de trouver comment l'utiliser.
 
J'ai beau chercher sur le net, pas moyen de trouver ça, il en manque toujours des bouts, c'est parfois éclaté sur plusieurs classes (évidemment non fournies), et quelquefois ça se termine en bouts de codes java 1.5, évidemment incomplets eux aussi.
 
Exemple très basique :
Je crée une liste de prénoms. J'en insère 5. Je relis ma liste et j'affiche ces 5 prénoms, le tout dans une même classe.
Accessoirement, j'intercale ensuite 2 prénoms entre le 3e et le 4e et je réaffiche ma liste, mais ça, on peut remettre à plus tard. (Ma liste est prévue pour grandir.)
 
Dans mes différents essais, en général j'ai un plantage sur le get :
MaClasse mc = (MaClasse) maListe.get(i);
 
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to fr.machin.MaClasse
 
L'idée générale, c'est bien entendu qu'une notion essentielle continue à m'échapper, je m'en doute un peu. N'empêche qu'avoir un exemple simple qui fonctionne, ça aiderait davantage que les remontrances qui s'apprêtent sans nul doute à fuser.
 
Je veux bien la solution en Java 1.5 pour faire plaisir à Eclipse, avec de l'iterator et des <trucs> dans tous les coins si la solution est également complète. Tant qu'à débuter, autant le faire sur les versions les plus à jour de Java.
 
Merci à ceux qui se rappelleront avoir un jour été des débutants pour leur aide précieuse.


Message édité par Kiosquec le 17-08-2007 à 19:05:24
mood
Publicité
Posté le 07-08-2007 à 19:06:10  profilanswer
 

n°1596970
jbourdello​n
Posté le 07-08-2007 à 23:20:49  profilanswer
 

Bonsoir,
 
Si dessous un  exemple rapide avec un peu de tout :  

Code :
  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. public class Test {
  4. public static void main(String[] args) {
  5.  ArrayList<String> maListe = new ArrayList<String>();
  6.  maListe.add("Permier Element" );
  7.  maListe.add("Second Element" );
  8.  maListe.add("Troisieme Element" );
  9.  maListe.add("Quatrieme Element" );
  10.  maListe.add("Cinquieme Element" );
  11.  for(int i = 0 ; i < maListe.size(); i++){
  12.   String maValeur = maListe.get(i);
  13.   System.out.println(maValeur);
  14.  }
  15.  maListe.add(2,"Entre 2 et 3" );
  16.  maListe.add(4,"Entre 3 et 4" );
  17.  Iterator<String> it = maListe.iterator();
  18.  while(it.hasNext()){
  19.   System.out.println(it.next());
  20.  }
  21. }
  22. }


 
Si jamais tu as des questions n'hesite pas
 
 :)

n°1597069
Kiosquec
Posté le 08-08-2007 à 10:46:18  profilanswer
 

Un grand merci, voilà de quoi me mettre le pied à l'étrier. J'ai adapté ça à mon programme, et il marche. J'ai juste eu un petit soucis parce que j'avais placé les .add hors de toute méthode, ce qui ne plaît évidemment pas à Eclipse.
 
L'étape suivante, ce sera de remplacer un élément par un autre. Je vais faire l'effort de chercher par moi-même, car une solution toute faite fournie à la fin, c'est très pratique, mais il faut aussi se casser un peu la tête sur un problème pour apprendre. (Mais je veux bien la solution ici :D , avec également la suppression d'enregistrements choisis pour faire le tour de la question, vu que ça peut resservir à tout les débutants).
Ca devrait commencer par là, non ?  
http://java.sun.com/j2se/1.4.2/doc [...] yList.html
 
Je suis toujours assez dérouté par la syntaxe à base de <truc> et par l'iterator, mais c'est accessoire. Il suffira que je tombe un jour sur un cours qui n'explique pas ça en 2 lignes, comme le font mes bouquins.  :non:
 
Je vois qu'il n'y a pas de maListe.get(x) comme il y en a dans l'exemple compliqué de mon livre de cours. C'est moi qui n'ai pas compris à quoi sert get, ou c'est un effet de l'iterator ?
 
La classe CaveAVin :
--------------------
 
import java.util.ArrayList;
import javax.swing.JOptionPane;
 
class CaveAVin
{
  public static void main (String[] args)
  {
    // Création d'instances de boisson
    Boisson soda = new Boisson("Soif !", 2);
    Boisson bordeaux = new BoissonAlcoolisee("Bordeaux", 4.5f, 12);
    // Création d'un ensemble illimité
    ArrayList caveAVin = new ArrayList ();
    // Ajout des boissons dans la cave à vin
    caveAVin.add (soda);
    caveAVin.add (soda);

    // La 3ème et la 4ème places sont vides
    caveAVin.add (null);
    caveAVin.add (null);
    // Ajout de 4 bouteilles de Bordeaux
    for (int i = 4; i <= 7; i++)
      caveAVin.add (bordeaux);
    // Affectation de la 4ème place
    caveAVin.set (3, new Boisson("Limonade", 2));
    // Calcul et affichage du prix du casier
    // et du nombre de places laissees vide
    float prix = 0;
    int   placesVides = 0;
    for (int i = 0; i < caveAVin.size(); i++)
    {
      // L'ensemble peut contenir n'importe
      // quel objet => Conversion de la
      // reference en classe Boisson
      Boisson boisson=(Boisson)caveAVin.get(i);
      if (boisson != null)
        prix += boisson.getPrix();
      else
        placesVides++;
    }
    JOptionPane.showMessageDialog (null,
      "Valeur de la cave : "+ prix +" \u20AC"
      + "\n" + placesVides + " place vide" );
    System.exit (0);
  }
}
 
 
La classe Boisson :
------------------
 
class Boisson implements Payant
{
  private String nom;  // Champ memorisant le nom d'une boisson
  private float  prix; // Champ memorisant le prix d'une boisson
 
  public Boisson (String nom, float prix)
  {
    this.nom  = nom;
    this.prix = prix;
  }
 
  public String getNom ()
  {
    return this.nom;
  }
 
  public float getPrix ()
  {
    return this.prix;
  }
}
 
class BoissonAlcoolisee extends Boisson
{
  private int degreAlcool; // Champ memorisant le degre d'alcool d'une boisson alcoolisee
 
  public BoissonAlcoolisee (String nom, float prix, int degreAlcool)
  {
    // Initialisation de l'objet Boisson
    super (nom, prix);
    // Initialisation de l'objet BoissonAlcoolisee
    this.degreAlcool = degreAlcool;
  }
 
  public int getDegreAlcool ()
  {
    return this.degreAlcool;
  }
}
 
class Boissons
{
  public static void main (String [] args)
  {
    // Creation d'un objet de la super classe com.eteks.test.Boisson
    Boisson jus = new Boisson ("Jus d'orange", 3.f);
    String message = jus.getNom () + " \u00e0 "
                     + jus.getPrix() + " \u20ac";
    javax.swing.JOptionPane.showMessageDialog(null, message);
    // Creation d'un objet de la sous classe com.eteks.test.BoissonAlcoolisee
    BoissonAlcoolisee porto;
    porto = new BoissonAlcoolisee ("Porto", 9.5f, 18);
    // On peut appeler les methodes getNom, getPrix et getDegreAlcool avec porto
    message = porto.getNom () + " " + porto.getDegreAlcool()
              + "\u00b0 \u00e0 " + porto.getPrix() + " \u20ac";
    javax.swing.JOptionPane.showMessageDialog(null, message); // Affiche Porto 18¡ a 9.5 euro
  }
}
 
 
Payant :
--------
 
public interface Payant
{
  float getPrix (); // getPrix est implicitement public et abstract
}
 
 
J'aurais peut-être intérêt pour mon problème à écrire une classe à part qui fabrique les éléments que je place dans mon ArrayList. Après tout, mon programme principal n'a aucune raison de gérer lui-même les infos qu'elle contient, comme dans l'exemple de la cave à vin, qui n'a pas à s'occuper de fabriquer les bouteilles.


Message édité par Kiosquec le 08-08-2007 à 10:56:16
n°1597205
jbourdello​n
Posté le 08-08-2007 à 14:45:09  profilanswer
 

Voila un exemple plus complet avec suppression et des commentaires ( beaucoup de commentaires d'ailleurs, je m'étonne parfois...)

Code :
  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. public class Test {
  4. public static void main(String[] args) {
  5.  /* Une ArrayList de String
  6.   *   
  7.   *  Ex : Une ArrayList de "Fromage"
  8.   *  ArrayList<Fromage> mesFromages = new ArrayList<Fromage>();
  9.   *  
  10.   */
  11.  ArrayList<String> maListe = new ArrayList<String>();
  12.  /* add(element) : Ajout d'un element dans la liste*/
  13.  maListe.add("Permier Element" );
  14.  maListe.add("Second Element" );
  15.  maListe.add("Troisieme Element" );
  16.  maListe.add("Quatrieme Element" );
  17.  maListe.add("Cinquieme Element" );
  18.  /* maListe.size() : retourne le nombre d'element de la liste */
  19.  for(int i = 0 ; i < maListe.size(); i++){
  20.   /* maListe.get(i) : retourne le ième element de la liste qui est déjà une String vu que l'ArrayList est une ArrayList de String  
  21.    *
  22.    * Autrement la version < java 5 :  
  23.    *  
  24.    *   ArrayList maliste = new ArrayList();
  25.    *   maListe.add(monFromage);
  26.    *   Fromage monFromage = (Fromage)maListe.get(0);
  27.    *  
  28.    */
  29.   String maValeur = maListe.get(i);
  30.   System.out.println(maValeur);
  31.  }
  32.  /* add(index,element) : Ajout d'un element dans la liste à la position passée en paramètre (index)  
  33.   * Attention les index commencent à 0
  34.   */
  35.  maListe.add(2,"Entre 2 et 3" );
  36.  maListe.add(4,"Entre 3 et 4" );
  37.  /* Iterator : objet permettant de parcourant les elements d'une liste  
  38.   * Ici Iterator de String car Iterator d'une ArrayList de String  
  39.   */
  40.  Iterator<String> it = maListe.iterator();
  41.  /*
  42.   * it.hasNext() retourne true tant qu'il y a des elements dans la liste
  43.   */
  44.  while(it.hasNext()){
  45.   /* it.next() retourne l'element suivant de la liste ici directement une String
  46.    *  
  47.    * Autrement la version < java 5 :  
  48.    *  
  49.    *   ArrayList maliste = new ArrayList();
  50.    *   maListe.add(monFromage);
  51.    *   Iterator it = maListe.iterator();
  52.    *   while(it.hasNext()){
  53.    *    Fromage monFromage = (Fromage)it.next();
  54.    *  }
  55.    */
  56.   System.out.println(it.next());
  57.  }
  58.  /*  
  59.   * remove(index) : supprime le ième element de la liste  
  60.   * Ici on supprime les deux elements quel'on a ajouté tout à l'heure
  61.   */
  62.  maListe.remove(4);
  63.  maListe.remove(2);
  64.  Iterator<String> it2 = maListe.iterator();
  65.  while(it2.hasNext()){
  66.   System.out.println(it2.next());
  67.  }
  68. }
  69. }

n°1597406
Kiosquec
Posté le 08-08-2007 à 18:27:34  profilanswer
 

Un nouveau merci, cette fois au nom de tous ceux qui rament avec les ArrayList.
 
Et comme il faut bien compliquer un peu le problème, je déporte maintenant la création de l'arraylist sur une autre classe, où je déclare  
 
 private static ArrayList<String> maListe = new ArrayList<String>();
 
Puisque j'ai mis ça en private, j'ajoute :
 
 public ArrayList getMaListe() {
  return this.MaListe;
 }

 
 
Là, déjà, Eclipse boude un peu en me disant "The static field MaClasse.MaListe should be accessed in a static way".
 
Plus loin, je crée cette méthode :
 
 public void creeListe() {
  String ajout = ... des trucs et des machins ...;
  maListe.add(ajout);
 }

Plus loin encore, j'ai ça :
 
 public static void desDonnees () {
  MaClasse truc = new MaClasse( ... des trucs et des machins ...);
  truc.creeListe();
 }
 
 public static void autresDonnees () {
  MaClasse autreTruc = new MaClasse( ... autres trucs et autres machins ...);
  autreTruc.creeListe();
 }

 
Ma méthode main () :
 
 // Méthode main
 public static void main(String[] args) {
                   desDonnees();        
                   autresDonnees();
                   autresDonnees();
                   autresDonnees();
  Iterator<String> it = maListe.iterator();
  while (it.hasNext()) {
   System.out.println(it.next());
  }
  }

 
J'appelle plusieurs fois autresDonnees() parce qu'il s'agit en fait d'une sorte de moule de genre : Prenom = xxx, Nom = yyy répété plusieurs fois, mais où je serai amené à changer par la suite les xxx et les yyy sans changer le nombre des prénoms et des noms. (C'est un peu plus complexe en réalité, mais ça revient à ça).
 
La méthode desDonnees () insère autre chose que des noms et des prénoms dans ce qui servira plus tard d'en-tête. A la fin de la fin de tous mes traitements, maListe sera convertie en fichier XML. Pas avant car il peut y avoir des corrections à effectuer sur les données enregistrées dans maListe (parfois plusieurs prénoms pour une personne, par exemple).
 
Je suis content de pouvoir créer ma liste dans MaClasse et de savoir l'afficher, mais ça, c'était juste pour savoir si j'obtiens le résultat escompté. En réalité, C'est à partir d'une autre classe que j'appellerai ce que j'ai écrit dans main().
Et là, ça se complique.
 
Comment rappeler et lister maListe à partir de cette autre classe ?
 
J'ai un bout du main() qui n'est pas rejeté par Eclipse :
 
         MaClasse.desDonnees();        
         MaClasse.autresDonnees();
         MaClasse.autresDonnees();
         MaClasse.autresDonnees();

 
Mais ça coince ici :
 
   Iterator<String> it = maListe.iterator();
   while (it.hasNext()) {
    System.out.println(it.next());
   }

 
Message : maListe cannot be resolved.
 
 
Ca coince aussi avec ça :
 
   Iterator<String> it = MaClasse.maListe.iterator();
   while (it.hasNext()) {
    System.out.println(it.next());
   }

 
Message : The field MaClasse.maListe is not visible.
 
Bon, moi j'ai mis private parce que les formateurs avaient l'air d'y tenir quand ils ont tenté de m'apprendre Java. J'ai fait une méthode getMaListe(), mais je ne vois pas comment l'utiliser. (Et il y a ce message should be accessed en static mode qui traîne).
 
Ah ! que c'est dur de penser objet quand on vient du basic et du html ! Déjà beau si je ne me suis pas planté sur la façon d'écrire une liste contenant quelques lignes spécifiques puis autant de fois qu'il le faudra le même bloc.

n°1597421
jbourdello​n
Posté le 08-08-2007 à 19:08:45  profilanswer
 

Kiosquec a écrit :


 private static ArrayList<String> maListe = new ArrayList<String>();


 
Pourquoi static ???
 

Kiosquec a écrit :


Puisque j'ai mis ça en private, j'ajoute :
 
 public ArrayList getMaListe() {
  return this.MaListe;
 }



Ok  
 

Kiosquec a écrit :


Là, déjà, Eclipse boude un peu en me disant "The static field MaClasse.MaListe should be accessed in a static way".


 
En suprimmant static l'erreur va disparaitre
 

Kiosquec a écrit :


Plus loin, je crée cette méthode :
 
 public void creeListe() {
  String ajout = ... des trucs et des machins ...;
  maListe.add(ajout);
 }

Plus loin encore, j'ai ça :


 
Ca me parait pastrop mal, le seul probleme c'est qu'il n'y a pas de parametres à ta fonction donc tu ajoutes toujours la meme chose dedans  
 
je pense qu'un truc comme ca serait mieux :

Code :
  1. public void creeListe(String ajout ) {
  2.     maListe.add(ajout);
  3. }


 

Kiosquec a écrit :


 public static void desDonnees () {
  MaClasse truc = new MaClasse( ... des trucs et des machins ...);
  truc.creeListe();
 }
 
 public static void autresDonnees () {
  MaClasse autreTruc = new MaClasse( ... autres trucs et autres machins ...);
  autreTruc.creeListe();
 }



Je vois pas bien l'interet, surtout si tu as une main ???

Kiosquec a écrit :


Ma méthode main () :
 
 // Méthode main
 public static void main(String[] args) {
                   desDonnees();        
                   autresDonnees();
                   autresDonnees();
                   autresDonnees();
  Iterator<String> it = maListe.iterator();
  while (it.hasNext()) {
   System.out.println(it.next());
  }
  }



 

Kiosquec a écrit :


J'appelle plusieurs fois autresDonnees() parce qu'il s'agit en fait d'une sorte de moule de genre : Prenom = xxx, Nom = yyy répété plusieurs fois, mais où je serai amené à changer par la suite les xxx et les yyy sans changer le nombre des prénoms et des noms. (C'est un peu plus complexe en réalité, mais ça revient à ça).
 
La méthode desDonnees () insère autre chose que des noms et des prénoms dans ce qui servira plus tard d'en-tête. A la fin de la fin de tous mes traitements, maListe sera convertie en fichier XML. Pas avant car il peut y avoir des corrections à effectuer sur les données enregistrées dans maListe (parfois plusieurs prénoms pour une personne, par exemple).
 
Je suis content de pouvoir créer ma liste dans MaClasse et de savoir l'afficher, mais ça, c'était juste pour savoir si j'obtiens le résultat escompté. En réalité, C'est à partir d'une autre classe que j'appellerai ce que j'ai écrit dans main().
Et là, ça se complique.
 
Comment rappeler et lister maListe à partir de cette autre classe ?
 
J'ai un bout du main() qui n'est pas rejeté par Eclipse :
 
         MaClasse.desDonnees();        
         MaClasse.autresDonnees();
         MaClasse.autresDonnees();
         MaClasse.autresDonnees();

 
Mais ça coince ici :
 
   Iterator<String> it = maListe.iterator();
   while (it.hasNext()) {
    System.out.println(it.next());
   }

 
Message : maListe cannot be resolved.
 
 
Ca coince aussi avec ça :
 
   Iterator<String> it = MaClasse.maListe.iterator();
   while (it.hasNext()) {
    System.out.println(it.next());
   }

 
Message : The field MaClasse.maListe is not visible.
 
Bon, moi j'ai mis private parce que les formateurs avaient l'air d'y tenir quand ils ont tenté de m'apprendre Java. J'ai fait une méthode getMaListe(), mais je ne vois pas comment l'utiliser. (Et il y a ce message should be accessed en static mode qui traîne).
 
Ah ! que c'est dur de penser objet quand on vient du basic et du html ! Déjà beau si je ne me suis pas planté sur la façon d'écrire une liste contenant quelques lignes spécifiques puis autant de fois qu'il le faudra le même bloc.


 
Alors, je crois qu'il y a un probleme de conception et pis surtout le concept objet!!!
Ci-dessous un petit bout de code :  
 

Code :
  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. public class MaListe {
  4. private ArrayList<String> maListe;
  5. public MaListe(){
  6.  this.maListe = new ArrayList<String>();
  7. }
  8. public ArrayList<String> getMaListe(){
  9.  return this.maListe;
  10. }
  11. public void ajoutValeur(String valeur){
  12.  this.maListe.add(valeur);
  13. }
  14. public static void main(String[] args) {
  15.  MaListe maListe = new MaListe();
  16.  maListe.ajoutValeur("Permier Element" );
  17.  maListe.ajoutValeur("Second Element" );
  18.  maListe.ajoutValeur("Troisieme Element" );
  19.  maListe.ajoutValeur("Quatrieme Element" );
  20.  maListe.ajoutValeur("Cinquieme Element" );
  21.  Iterator<String> it = maListe.getMaListe().iterator();
  22.  while(it.hasNext()){
  23.   System.out.println(it.next());
  24.  }
  25. }
  26. }


 

n°1597593
Kiosquec
Posté le 09-08-2007 à 11:14:57  profilanswer
 

Merci pour cette réponse qui m'en apprend encore un peu plus sur un sujet beaucoup trop vite traité pendant ma formation.
 
A vouloir trop simplifier, je n'ai pas été assez précis dans le problème que je cherche à traiter. Je vais exposer ici un sujet facile à comprendre et qui met en oeuvre sensiblement la même problématique que mon sujet réel (trop complexe à expliquer).
 
1 - Je reçois un fichier texte très rustique (encore moins précis que le résultat d'un formulaire html)
Ce fichier contient les références d'une personne, d'une part, et une liste de livres OU de CD OU de vidéos d'autre part.
Dans le cas de livres, j'aurai le titre, le ou les auteurs, l'editeur, la collection, l'année, etc.
Dans le cas de CD, j'aurai le titre de l'album, l'interprète, les titres de chansons, etc.
Dans le cas de vidéos, j'aurai le titre, le réalisateur, les acteurs principaux, le genre, etc.
Bien entendu, il manquera des informations un peu partout, et le fichier texte étant écrit à la main, il y aura pas mal d'erreurs de présentation (espaces, majuscules, fautes de frappe, etc.)
 
2 - Je veux convertir ce fichier texte en fichier XML afin de pouvoir en faire ce que je veux : alimenter une base de données, convertir le fichier texte en fichier Excel, afficher les données sur une page Web, envoyer les données à un correspondant qui les traitera à sa manière, ou n'importe quoi d'autre.
Je pense que le format XML est bien adapté dans ce cas.
 
3 - Je constate que les fichiers reçus seront différents selon qu'ils traitent de livres, de CD ou de vidéo. Leur point commun, c'est qu'ils sont tous bâtis sur le modèle Label = Valeur.
Ils ont des labels en commun et d'autres qui leurs sont personnels.
Ils ont tous une partie qui concerne le propriétaire et une partie qui duplique x fois une série de labels.
Certains labels sont absents du fichier initial mais devront être présents dans le résultat final, avec une valeur nulle ou par défaut.
Certains labels sont présents plusieurs fois de suite (plusieurs auteurs, plusieurs acteurs, ...)
 
Pour résoudre ce problème, je commence par créer une classe MesLabels qui recense tous les labels possibles. Je peux décider d'en ajouter ou d'en supprimer par la suite pour améliorer l'appli.
Cette classe possède des méthodes qui fabriquent le blocs de labels adapté aux livres, celui adapté aux aux CD celui adapté aux films, et celui qui correspond aux renseignements sur le propriétaire/expéditeur du fichier texte. (Pas besoin de méthode main() dans MesLabels, sinon pour tester le bon fonctionnement de la classe).
Chacune de ces méthodes ajoute à l'ArrayList une partie du squelette du fichier final, en y plaçant les valeurs par défaut.
 
Ma classe principale appelle les méthodes de la classe MesLabels pour fabriquer le squelette complet du fichier final.
Par exemple, si je reçois une liste de 3 livres, j'appelle la methode identite() puis 3 fois la méthode blocLivres().
l'ArrayList ressemblera à ceci :
 
nom = Doe
prenom = John
ville = Nowhere
titre = xxx
auteur = xxx
editeur = xxx
annee = 0
titre = xxx
auteur = xxx
editeur = xxx
annee = 0
titre = xxx
auteur = xxx
editeur = xxx
annee = 0
 
Ensuite, la classe principale se charge de modifier le squelette ainsi généré pour y placer les bonnes valeurs et éventuellement ajouter les champs multiples qui manquent.
Résultat :
 
Par exemple, si je reçois une liste de 3 livres, l'ArrayList ressemblera à ceci :
 
nom = Martin
prenom = Jean
ville = Nowhere
titre = Les 3 mousquetaires
auteur = Alexandre Dumas
editeur = xxx
annee = 0
titre = Java 2
auteur = Robert Chevallier
editeur = CampusPress
annee = 2002
titre = Les aventures de moi-même
auteur = Paul Machin
auteur = Philippe Truc
auteur = Albert Bidule
editeur = xxx
annee = 0
 
Les champs non trouvés dans le fichier texte conservent leurs valeurs par défaut (qu'elles soient judicieuses ou non), et ici j'ai dû ajouter deux champs auteur par rapport au squelette généré.
Il ne reste plus qu'à relire ligne par ligne l'ArrayList pour générer le fichier XML.  
 
Mais pour ça, il faut que je sache lire dans ma classe principale l'ArrayList générée par les appels successifs aux méthodes de MesLabels.
Reste à savoir quel doit être le rôle pécis de MesLabels, ce que cette classe doit impérativement faire et ce qui n'est pas de son ressort, sachant qu'une autre classe que ma classe principale pourrait avoir besoin de l'appeler pour une raison x.
 
Est-ce plus clair ainsi ?
 

n°1597638
jbourdello​n
Posté le 09-08-2007 à 12:15:13  profilanswer
 

Ok, donc mes craintes se confirment, concernant le coté POO,  
Tu dis que tu vas recevoir 3 types d'infos : des CDs, des livres, des videos alors pourquoi ne pas générer 3 classes une classe Livre , une classe CD , une classe Video avec les attributs correspondant pour chacune des classes ???
 
Ensuite visiblement tu arrives savoir quel type d'info tu recois et en combien d'exemplaire, donc ton programme principal tu crees x fois le bon objet que tu remplis ?!?  
 
Et ensuite tu ajoutes tous ces objets dans une ArrayList que tu parcours pour generer le fichier XML ?
Ala rigueur, mais bon ca ne sera pas pour tout de suite mais il existe des librairies qui te permettent de generer directement tes elements XML a partir d'objet JAVA
 
Désolé pas d'exemple, j'ai pas le temps, mais à la limite poste tes classes au fur et à mesure et je t'aidrais à les corriger

n°1597665
Kiosquec
Posté le 09-08-2007 à 13:22:58  profilanswer
 

jbourdellon a écrit :

Ok, donc mes craintes se confirment, concernant le coté POO,  
Tu dis que tu vas recevoir 3 types d'infos : des CDs, des livres, des videos alors pourquoi ne pas générer 3 classes une classe Livre , une classe CD , une classe Video avec les attributs correspondant pour chacune des classes ???
 
Ensuite visiblement tu arrives savoir quel type d'info tu recois et en combien d'exemplaire, donc ton programme principal tu crees x fois le bon objet que tu remplis ?!?  
 
Et ensuite tu ajoutes tous ces objets dans une ArrayList que tu parcours pour generer le fichier XML ?
Ala rigueur, mais bon ca ne sera pas pour tout de suite mais il existe des librairies qui te permettent de generer directement tes elements XML a partir d'objet JAVA
 
Désolé pas d'exemple, j'ai pas le temps, mais à la limite poste tes classes au fur et à mesure et je t'aidrais à les corriger


 
Je retiens ta suggestion en ce sens qu'elle peut résoudre mon problème. Et aussi parce que j'ai bien assez de mal à utiliser la notion d'objets, ce qui m'incite à faire confiance à ceux qui la comprennent.
 
Ce qui m'embête un peu dans l'histoire, c'est de créer 3 classes qui ont quand même pas mal de choses en commun, c'est pourquoi j'ai spontanément opté pour une classe contenant tous les labels possibles et des méthodes qui piochent dans ces labels pour créer le bout d'ArrayList qui les concerne. Si je suis amené à modifier un label, à en ajouter ou à en supprimer, ça me fait une seule classe à modifier, et si le reste est correctement paramétré, tout suit automatiquement.
 
J'ai envisagé des extensions de classe, mais pas trouvé comment ça pourrait s'appliquer ici. Mon constructeur dit qu'il faut prendre un paramètre label, un séparateur "=" et un paramètre valeur par défaut. Que viendrait faire l'héritage là-dedans ? La seule différence réside dans la création d'instances et non dans leurs propriétés plus ou moins étendues :
 
MaClasse nom = new MaClasse("nom", "Doe" );
MaClasse prenom = new MaClasse("prenom", "John" );
MaClasse titre = new MaClasse("titre", "titre par défaut" );
MaClasse auteur = new MaClasse("auteur", "Anonymous" );
etc.
 
Donc cette classe est valable aussi bien pour les livres que le CD ou les films. Il suffit d'instancier ce dont on a besoin, le construteur est inchangé. (Je sens qu'il y a un truc qui cloche dans ma logique, mais je n'arrive pas à définir quoi précisément. J'ai besoin de la liste de mes labels et de leurs valeurs, mais est-il bien utile de créer ici les instances nom, prenom etc. ?).
 
Ce que je veux à tout prix éviter, c'est de tout coller dans une classe unique et développer en linéaire, comme si je programmais en basic.
 
-------------------------
 
De toute façon, même si j'adopte la procédure que tu me conseilles, je suis tombé sur un os avec cette question non résolue de récupération d'une ArrayList créée par une autre classe. Ce n'est peut-être plus mon problème immédiat, mais la réponse serait intéressante pour une bête question de culture générale.
Un exemple bateau serait donc de ce type :
 
Une classe crée une ArrayList de 5 éléments et l'utilise pour divers traitements (problème résolu).
Une autre classe cherche à afficher le contenu de cette ArrayList.

n°1597691
jbourdello​n
Posté le 09-08-2007 à 14:31:25  profilanswer
 

Citation :

Pourquoi pas plutot une classe Media avec un attribut déterminant le type ( enum ) ?


 
Oui ou alors que les 3 classes héritent d'une classe Mere "Media" contenant les attributs communs,
 
Enfin quoi qu'il en soit il n'y a rien de si alarmant dans le fait d'utiliser 3 classes, il ne faut pas éxagerer non plus

mood
Publicité
Posté le 09-08-2007 à 14:31:25  profilanswer
 

n°1597804
jbourdello​n
Posté le 09-08-2007 à 16:33:06  profilanswer
 

Il n'y a pas vraiment à choisir mon camp, mais bon je ne sias pas si tu as suivi le sujet depuis le début, mais bon le niveau c'est plutot débutant donc je ne voulais pas l'embrouiller tout de suite avec l'héritage etc, mais bien entendu que je lui en aurais parler une fois que ces programmes ne seraient plus qu'une enorme main, logique non ?

n°1597854
Kiosquec
Posté le 09-08-2007 à 17:10:44  profilanswer
 

jbourdellon a écrit :

Il n'y a pas vraiment à choisir mon camp, mais bon je ne sias pas si tu as suivi le sujet depuis le début, mais bon le niveau c'est plutot débutant donc je ne voulais pas l'embrouiller tout de suite avec l'héritage etc, mais bien entendu que je lui en aurais parler une fois que ces programmes ne seraient plus qu'une enorme main, logique non ?


C'est bien ce qu'il s'agit d'éviter, effectivement. Ma formation antérieure m'a donné de très mauvais réflexes dès qu'il s'agit de langage objet.

n°1600561
Kiosquec
Posté le 17-08-2007 à 19:04:58  profilanswer
 

ese-aSH a écrit :


et t'as un moyen de déterminer quel champs sont présents ou absents ... des ';' , des tabulations, un indicateur ?
sinon je vois pas trop comment tu comptes faire :o


Eh bien, en fait, j'ai pas mal progressé dans mon programme, grâce aux conseils et aussi aux eng... reçus ici.
Je suis actuellemnt en mesure :
 
1 - de lire un fichier mal ficelé, avec des labels un peu en vrac.
 
Par exemple :
 
livre = mon bouquin
editeur = machin
auteur = truc
annee = 2000
auteur = zig
auteur = zag
prix = 10
livre = un autre livre
auteur = dupont
prix = 50
annee = 2002
auteur = durand
 
2- D'en faire ceci :
 
livre = Mon bouquin
auteur = Truc
auteur = Zig
auteur = Zag
editeur = Machin
annee = 2000
prix = 10
livre = Un autre livre
auteur = Dupont
auteur = Durand
annee = 2002
prix = 50
 
Ce qui est déjà plus sympathique, merci les ArrayList !
 
3- Je sais aussi transformer quelque chose qui ressemble à ceci :
 
livre = defaut
auteur = defaut
editeur = defaut
annee = defaut
prix = defaut
livre = defaut
auteur = defaut
auteur = defaut
auteur = defaut
editeur = defaut
annee = defaut
prix = defaut
 
...en quelquechose comme ceci :
 
<?xml version="1.0" encoding= "ISO-8859-1" ?>
<bibliotherque>
<nom>defaut</nom>
<prenom>defaut</prenom>
<ville>defaut</ville>
<reference_numero id="1">
<titre>defaut</titre>
<les_auteurs>
 <auteur>defaut</auteur>
<editeur>defaut></editeur>
<annee>defaut</annee>
<prix>defaut</prix>
</reference>
<reference_numero id="2">
<titre>defaut</titre>
<les_auteurs>
 <auteur>defaut</auteur>
 <auteur>defaut</auteur>
 <auteur>defaut</auteur>
<editeur>defaut></editeur>
<annee>defaut</annee>
<prix>defaut</prix>
</reference>
</bibliotheque>
 
Il me reste à remplir correctement le fichier des valeurs par défaut avec les données remises dans l'ordre, ce qui ne devrait pas être bien sorcier.
Puis, quand j'aurai généré un fichier XML avec les vraies valeurs, je me pencherai sur le transfert du fichier XML dans une base de données. Base qui servira à générer des pages webs.
En amont, je dois encore trouver comment récupérer le fichier tout en vrac du début dans une messagerie.
En PHP, je sais faire tout ça, pas par coeur, ne nous emballons pas ! En java... ça va encore me faire réfléchir un moment.
 
Un grand merci pour le dépannage sur les ArrayList, et aussi sur l'idée d'utiliser Enum. Je m'en sers d'une part pour rendre immuable l'orthographe des champs (Eclipse me fait immédiatement une scène si j'écris Livre pour livres), et comme mon appli réelle compte beaucoup plus de champs que mon exemple, ça me permet de faire un switch avec les valeurs possibles et un traitement unique pour les valeurs erronées.
 
Le plus dur, c'est quand même de comprendre java et de penser Java.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Résolu - Arrayliste, exemple COMPLET

 

Sujets relatifs
[résolu] CSS zoom limité à 30 images ?Tri de réponses chiffre/caractère [resolu]
[Résolu][MYSQL] lister les doublons + rapidementRésolu
Trigger sur la base et non sur une table [resolu][Résolu] Problème avec les variables de session
Différence d'interpretation IE/firefox sur blog[Résolu] Erreur AJAX
[résolu] une page dans une autre page ?Resolu [VBS] lister les connexions TCP (comme netstat)
Plus de sujets relatifs à : Résolu - Arrayliste, exemple COMPLET


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR