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

Collection et Stream Java Discussion :

[Méthode de tri][Arbre binaire] Problème dans l'ordre total


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2006
    Messages : 50
    Points : 26
    Points
    26
    Par défaut [Méthode de tri][Arbre binaire] Problème dans l'ordre total
    Bonjour à tous,

    J'ai un problème avec la classe TreeMap. Je voulais utiliser cette classe pour son gros potentiel de tri mais le problème c'est qu'il lui faut un ordre total (pas de doublons dans les clés). J'ai donc bidouillé une classe Comparator afin de dépasser le problème mais du coup j'ai des erreurs.

    Evidemment, si vous avez des idées afin d'avoir un Arbre qui gère un ordre avec doublon, je suis preneur. Un truc du style 0 <= 0 < 1 < 24 <= 24 < 25

    Code de mon comparateur :
    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
     
    public class ComparateurCellNombreHost implements Comparator {
     
        public int compare(Object arg0, Object arg1) {
            if(!(arg0 instanceof CellNombreHost) && !(arg1 instanceof CellNombreHost)) {
                throw new ClassCastException();
            }
            int i = ((CellNombreHost)arg0).getNb();
            int j = ((CellNombreHost)arg1).getNb();
     
            if(i == j) {
                return -1;
            }
            else {
                return (i - j) * 10;
            }
        }
    }
    Code de ma clé
    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
     
    public class CellNombreHost {
        // VARIABLE
     
        private String host;
     
        private int nb;
     
        /**
         * Constructeur vide.
         */
        public CellNombreHost() {
            super();
        }
     
        /**
         * Constructeur avec paramètres.
         */
        public CellNombreHost(String nomHost, int nombre) {
            super();
            this.host = nomHost;
            this.nb = nombre;
        }
     
        /**
         * Renvoi la valeur du champ nb.
         * @return Retourne un int pour la valeur du champ nb
         */
        public int getNb() {
            return nb;
        }
     
        /**
         * Modifie la valeur du champ nb.
         * @param nombre nombre de connexion mensuelle
         */
        public void setNb(int nombre) {
            this.nb = nombre;
        }
     
        /**
         * Renvoi la valeur du champ host.
         */
        public String getHost() {
            return host;
        }
     
        /**
         * Modifie la valeur du champ host.
         */
        public void setHost(String nomHost) {
            this.host = nomHost;
        }
    }
    Code de mon utilisation de TreeMap
    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
     
    TreeMap<CellNombreHost, String> listCell = new TreeMap<CellNombreHost, String>(new ComparateurCellNombreHost());
     
            // Rempli un ARBRE avec des données
            for (int i = 0; i < v.size(); i++) {
                ArrayList work = (ArrayList) v.get(i);
                String name = (String) work.get(0);
                String nb = (String) work.get(1);
                URL url = new URL(name);
     
                if(ancienUrl != null && (!ancienUrl.getHost().equals(url.getHost())) && new Integer(nb) > nbTolereSiteBloque && i != 0) {
                    listCell.put(new CellNombreHost(ancienUrl.getHost(), new Integer(nb)), ancienUrl.getHost());
                    nbUrl = 0;
                }
                nbUrl++;
                ancienUrl = url;
            }
     
            while(listCell.size() != 0) {
                CellNombreHost key = listCell.lastKey();
                ch.append("<tr><td>");
                ch.append(key.getHost());
                ch.append("</td><td>");
                ch.append(key.getNb());
                ch.append("</td></tr>");
                if(listCell.containsKey(key)) {
                    System.out.println("ok");
                }
                if(listCell.containsKey(listCell.lastKey())) {
                    System.out.println("ok");
                }
                listCell.remove(listCell.lastKey());
            }
            ch.append("</table></body></html>");
    Mon problème se situe au moment où je veux enlever de mon arbre la clé la plus haute. En fait, listCell.remove(listCell.lastKey()); ne fonctionne pas et donc très logiquement, j'ai une erreur de type JavaHeapSpace.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2006
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Pour le javaHeapSpace, une erreur de ma part qui s'est réglée toute seule.

    Pour la comparaison avec doublon, suffit de mettre dans le Comparator ceci

    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
     
    public class ComparateurCellNombreHost implements Comparator {
     
        public int compare(Object arg0, Object arg1) {
            if(!(arg0 instanceof CellNombreHost) && !(arg1 instanceof CellNombreHost)) {
                throw new ClassCastException();
            }
            int i = ((CellNombreHost)arg0).getNb();
            int j = ((CellNombreHost)arg1).getNb();
     
            if(i == j) {
                System.out.println("-1");
                String a = ((CellNombreHost)arg0).getHost();
                String b = ((CellNombreHost)arg1).getHost();
                int tot = a.compareTo(b);
                return tot % 100;
            }
            else {
                System.out.println((i - j)*100);
                return (i - j) * 100;
            }
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. arbre binaire (problème de récursivité)
    Par allomona dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 11/06/2012, 23h10
  2. [WD-2007] problème dans l'ordre des légendes
    Par dearraed dans le forum Word
    Réponses: 5
    Dernier message: 25/05/2010, 02h59
  3. une méthode de représentation arbre binaire en java
    Par bilred dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 23/04/2009, 13h21
  4. Réponses: 3
    Dernier message: 15/03/2008, 15h15
  5. tri arbre binaire
    Par catilina dans le forum C
    Réponses: 2
    Dernier message: 20/10/2005, 09h48

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