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 :

Coincé sur une histoire de trie (HashTable, Collections . . .)


Sujet :

Langage Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Points : 201
    Points
    201
    Par défaut Coincé sur une histoire de trie (HashTable, Collections . . .)
    Bonjour!

    J'ai un petit soucis de trie que je n'arrive pas à résoudre.

    J'ai une classe "Cible" simplifiée ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Cible
    {
        public int distance;
    }
    Un HashTable dans une autre classe tel que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class UneClasse
    {
        public Hashtable<Integer, Cible> cibles = new Hashtable<Integer, Cible>();
    }
    Remarque : Toutes les combinaisons (Integer, Cible) de la Hashtable sont uniques, ainsi que les clés Integer

    Une fois cette Hashtable remplie je souhaiterai la trier en fonction des valeurs "distance" de la classe cible (valeur) de manière décroissante.

    Je me doute bien que je suis mal parti (choix de la collection...) pour réaliser mon trie mais je n'ai pas trop d'idées...

    J'ai entendu parler des TreeMap et de "Comparator" mais je ne sais pas trop comment utiliser tout ça!

    Edit : il peut y avoir des égalités pour ce qui est des valeurs "distance" de la classe "Cible"

    Merci!

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    la hashtable n'a pas d'ordre. Pour quelque chose d'ordonné, il te faut utiliser une implémentation de SortedMap, telle que TreeMap ou LinkedHashMap

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Points : 201
    Points
    201
    Par défaut
    Merci beaucoup pour cette réponse qui m'a permis de retomber sur un très bon article de la faq : http://java.developpez.com/faq/java/...IONS_trier_map

    Cependant je me pose une toute petite question, je me suis trompé plus haut et la distance sera un double et non un int.

    J'ai donc écrit ma classe comparator ainsi :

    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
        public class TargetComparator implements Comparator<Double>
        {
            private Map<Integer, Target> targets;
     
            public TargetComparator(Map<Integer, Target> targets)
            {
                this.targets = targets;
            }
     
            public int compare(Double id1, Double id2)
            {
                Target p1 = targets.get(id1);
                Target p2 = targets.get(id2);
     
                return (int)(p1.getDistance() - p2.getDistance());
            }
        }
    Je me pose 2 petites questions :
    -Le fait de caster le résultat en int (pour correspondre avec le type de retour de la méthode "compare", vais perdre ma précision?
    Si deux cibles ont pour distance respective 1.54 et 1.55, seront elles triés de telle sorte à ce que la première soit plus courte que la seconde?
    -Que ce passe t'il en cas d'égalité?

    Merci encore!

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui, car -0.01 deviendra 0 (égalité)

    tu dois faire if (id1<id2) return -1 else if (id1>id2) return 1 else return 0

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Points : 201
    Points
    201
    Par défaut
    Si j'ai bien compris ça devrait donner ça :

    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
        public class TargetComparator implements Comparator<Integer>
        {
            private Map<Integer, Target> targets;
     
            public TargetComparator(Map<Integer, Target> targets)
            {
                this.targets = targets;
            }
     
            public int compare(Integer id1, Integer id2)
            {
                Target p1 = targets.get(id1);
                Target p2 = targets.get(id2);
     
                if(p1.getDistance() < p2.getDistance()) 
                    return -1;
                else if(p1.getDistance() > p2.getDistance()) 
                    return 1;
                return 0;
            }
        }
    PS : petite erreur sur mon post précédant, j'utilisais Double pour mon comparator alors que mes clés sont ds Integer.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Points : 201
    Points
    201
    Par défaut
    Ca a l'air de marcher comme sur des roulettes, merci beaucoup pour ce débloquage rapide!

    Résolu

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

Discussions similaires

  1. [Débutant] Traitement par lot sur une collection ( HashTable )
    Par handsome01 dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 09/09/2014, 16h08
  2. Réponses: 3
    Dernier message: 17/05/2008, 14h39
  3. Somme et trie sur une sous requete
    Par shinrei dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/05/2006, 10h45
  4. [Struts] <logic:iterate> sur une collection d objets c
    Par trax020 dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/05/2005, 00h11
  5. Trie sur une requette SELECT
    Par Yali dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/08/2004, 09h56

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