IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Sauvegarde List<String> via Stack


Sujet :

Langage Java

  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut Sauvegarde List<String> via Stack
    Bonjour,

    Je travail en ce moment sur une Applette permettant de rechercher des mots dans une chaine de caractères donnée, d'obtenir le nombre d'occurence du mot, de trier la chaine etc.

    Toutefois, j'ai un soucis dans la mise en œuvre de l'annulation. Pour cela, je dois passer par une Stack qui me permet de sauvegarder l'état de ma liste pour, si je souhaite, revenir en arrière via le boutton annuler.

    extrait du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Avant chacune des opérations modifiant ma liste :
     
      private void saveListe(List<String> l) {
          backup.push( l.subList(0,l.size()) );
      }
     
    Boutton Annuler :
     
     if (ae.getSource() == boutonAnnuler) { 
              if ( !backup.empty() ) liste = backup.pop(); 
     }
    Mon souci est le suivant : A chaque utilisation du boutton Annuler, la liste afficher me montre une liste identique à la liste en cours et non pas à la précédente.

    Si quelqu'un connait une solution...

    Le fait de stocker ma liste dans la Stack sauvegarde bien ma liste a un instant donné ou son pointeur?

    Merci

  2. #2
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut
    fais deux pop() , et récupère ta liste depuis le deuxième pop

  3. #3
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    pourrais-tu m'éclairer sur la démarche de devoir faire deux pop() ?

    Qu'est ce que cela engendre? Pourquoi faire cela?

  4. #4
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut
    quand tu fais saveList, tu sauvegarde ta liste au top de ton stack, donc le top de ton stack contient la liste actuelle
    quand tu fais backup.pop, tu récupère le top de ton stack, donc la liste actuelle et pas la liste précédent, c'est pour ça que je suppose qu'il faut faire 2 pop

  5. #5
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    sauf que j'effectue mon saveList avant toute modification de ma liste... donc ma stack contient logiquement pas la liste courante, mais la liste avant modification !!

  6. #6
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut
    si c'est comme ça, je vois pas où est le problème.
    si tu nous montrais ton code??

  7. #7
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.List;
    import java.util.LinkedList;
    import java.util.Map;
     
    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    import java.util.Stack;
     
    public class IHMListe2 extends JPanel implements ActionListener,ItemListener{
     
      private JPanel          cmd = new JPanel();
      private JLabel          afficheur = new JLabel();
      private JTextField      saisie = new JTextField();
     
      private JPanel          panelBoutons = new JPanel();
      private JButton         boutonRechercher = new JButton("rechercher");
      private JButton         boutonRetirer = new JButton("retirer");
     
      private CheckboxGroup  mode = new CheckboxGroup();
      private Checkbox       ordreCroissant = new Checkbox("croissant", mode, false);
      private Checkbox       ordreDecroissant = new Checkbox("decroissant", mode, false);
     
      private JButton         boutonOccurrences = new JButton("occurrence");
     
      private JButton         boutonAnnuler= new JButton("annuler");
     
      private TextArea       texte = new TextArea();
     
      private List<String>   liste;
      private Map<String,Integer>   occurrences;
     
      private Stack<List<String>> backup = new Stack<List<String>>();
     
     
      public IHMListe2(List<String> liste, Map<String,Integer> occurrences){
        this.liste = liste;
        this.occurrences = occurrences;
     
        cmd.setLayout(new GridLayout(3,1));
     
        cmd.add(afficheur);cmd.add(saisie);
     
        panelBoutons.setLayout(new FlowLayout(FlowLayout.LEFT));
        panelBoutons.add(boutonRechercher);panelBoutons.add(boutonRetirer);
        panelBoutons.add(new JLabel("tri du texte :"));
        panelBoutons.add(ordreCroissant);panelBoutons.add(ordreDecroissant);
        panelBoutons.add(boutonOccurrences);
        panelBoutons.add(boutonAnnuler);
        cmd.add(panelBoutons);
     
        afficheur.setText(liste.getClass().getName() + " et " + occurrences.getClass().getName());
        texte.setText(liste.toString());
     
        setLayout(new BorderLayout());
     
        add(cmd,"North");
        add(texte,"Center");
     
        boutonRechercher.addActionListener(this);
        boutonRetirer.addActionListener(this);
        boutonOccurrences.addActionListener(this);
        boutonAnnuler.addActionListener(this);
        ordreCroissant.addItemListener(this);
        ordreDecroissant.addItemListener(this);
     
      }
     
     
      public void actionPerformed(ActionEvent ae){
        try{
                boolean res=false;
          if (ae.getSource() == boutonRechercher || ae.getSource() == saisie) {
              res = liste.contains(saisie.getText());
              Integer occur = occurrences.get(saisie.getText());
              afficheur.setText("resultat de la recherche de : " + saisie.getText() + " -->  "+ res);
          }
          else if (ae.getSource() == boutonRetirer) {
              res = retirerDeLaListeTousLesElementsCommencantPar(saisie.getText());
              afficheur.setText("resultat du retrait de tous les elements commencant par -->  " + saisie.getText() + " : " + res);
          }
          else if (ae.getSource() == boutonOccurrences) {
              Integer occur = occurrences.get(saisie.getText());
              if(occur!=null)  
                afficheur.setText(" -->  " + occur + " occurrence(s)");
              else
                afficheur.setText(" -->  ??? ");
          }
          else if (ae.getSource() == boutonAnnuler) { 
              if ( !backup.empty() ) liste = backup.pop();
          }                                  
          texte.setText(liste.toString());
         } catch(Exception e){
              afficheur.setText( e.toString());
         }
      }
     
     
      public void itemStateChanged(ItemEvent ie){
        saveListe(liste);
        if (ie.getSource() == ordreCroissant)
          Collections.sort(liste);
        else if (ie.getSource() == ordreDecroissant)
            Collections.sort(liste,
                new Comparator<String>() {
                    public int compare(String s1, String s2) { return -s1.compareTo(s2); }
                }
            );
     
        texte.setText(liste.toString());
      }
     
     
      private boolean retirerDeLaListeTousLesElementsCommencantPar(String prefixe){
            boolean resultat = false;
            int i=0;
            int taille = liste.size();
            String s;
            String p = prefixe;
     
            saveListe(liste);
     
            if ( Pattern.matches("[ * ? ( ) [ ] { } ^ $ | + ].*",prefixe) ) p = "\\"+prefixe;
     
            while ( !resultat ){           
                if ( Pattern.matches(p+".*", (s=liste.get(i))) ) {
                    for(int j=0; j<occurrences.get(s); j++)
                        liste.remove(s);
                    occurrences.put(s,0);
                    taille = liste.size();
                } else i++;
                if ( i >= taille ) resultat = true;
            }
            return resultat;
      }
     
      private void saveListe(List<String> l) {
          backup.push( l.subList(0,l.size()) );
      }
     
    }

  8. #8
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut
    aucune idée, désolé
    juste une idée comme ça, puisqu'en java on parle que de référence ( ou pointeurs ), peut que quand tu appelle saveListe, il la sauvegarde dans l'objet Stack, et quand tu modifies les éléments de la liste, peut être que les modifications se répercutent sur la liste dans le Stack, au cas où touts les deux pointent sur les mêmes éléments, donc, peut-être que dans saveList, si tu créais un nouveau objet List, lui affecter les éléments de la liste dèjà créé, et puis après appeler push sur la nouvelle liste.
    enfin, c'est pas très claire dans ma tête, donc, c'est juste une idée comme ça...

  9. #9
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    J'ai déjà pensé à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      private void saveListe(List<String> l) {
          List<String> ltmp = l;
          backup.push( ltmp.subList(0,ltmp.size()) );
      }
    Mais cela ne change rien...

    Peut-être que je m'y prend mal... dans ce cas, auriez-vous la bonne méthode ?

    Cette manière de faire doit surement copier l'adresse du pointeur et donc cela revient au même. Toutefois, j'avais pensé à la méthode java.lang.Object.clone(), mais elle ne s'applique pas à une List<String> !!

  10. #10
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    Cela ne parle donc à personne...

  11. #11
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    Un essai toujours pas concluant ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sachant que la méthode subList() retourne une Liste<E> :
     
      private void saveListe(List<String> l) {
          List<String> ltmp = l.subList(0,l.size());
          backup.push( ltmp );
      }
    Je pensais copier ma liste et m'affranchir des soucis de pointeur... mais c'est toujours pareil !!

  12. #12
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Salut,

    Citation Envoyé par Iloyo Voir le message
    Un essai toujours pas concluant ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sachant que la méthode subList() retourne une Liste<E> :
     
      private void saveListe(List<String> l) {
          List<String> ltmp = l.subList(0,l.size());
          backup.push( ltmp );
      }
    Comme ceci cela devrait mieux marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void saveListe(List<String> l) {
          List<String> ltmp = new  ArrayList<String>(l);
          backup.push( ltmp );
      }
    A+
    Hydraland

Discussions similaires

  1. Récupération d'une liste de structures Oracle via Java
    Par MagikMarcel dans le forum Langage
    Réponses: 2
    Dernier message: 29/06/2006, 16h34
  2. Réponses: 23
    Dernier message: 08/06/2006, 15h06
  3. [Ajax] pb avec 3 combos listes recupérant les infos via mysql
    Par laulaurent dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/05/2006, 17h38
  4. [VB.net] Join d'un Array list de string?
    Par the_bmo dans le forum VB.NET
    Réponses: 8
    Dernier message: 15/12/2005, 13h53
  5. Comparaison d'une liste de string à un string
    Par maxazac dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/10/2005, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo