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 :

Trier une liste en comparant des doubles


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut Trier une liste en comparant des doubles
    Bonjour,

    Je souhaite trier une liste en créant un comparator portant sur des doubles.

    Avec des int je procède comme suit :

    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
     
    Collections.sort(
       (List) maListe,
       new Comparator() {
    	public int compare(Object o1, Object o2) {
    	    Produit p1 = (Produit) o1;
    	    Produit p2 = (Produit) o2;
    	    int i1 = 
    	        p1.getPrix() != null
    	        ? p1.getPrix().intValue()
    	        : 0;
    	     int i2 =
    	        p2.getPrix() != null
    	        ? p2.getPrix().intValue()
    	        : 0;
    	     return i1 - i2;
    	}
       });
    Mais aujourd'hui mes prix sont des double ... Comment faire alors ?
    Pour information, j'ai besoin de travailler sur 2 décimales, je peux donc éventuellement convertir mon prix.

    D'avance merci.

    Flo

  2. #2
    Membre actif Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Points : 221
    Points
    221
    Par défaut
    Salut,

    Je comprend mal ta question. Pourquoi ne peux tu pas simplement remplacer tes int par des double?

    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
     
    Collections.sort(
                       (List) maListe,
                       new Comparator() {
                        public double compare(Object o1, Object o2) {
                            Produit p1 = (Produit) o1;
                            Produit p2 = (Produit) o2;
                            double i1 = 
                                p1.getPrix() != null
                                ? p1.getPrix().doubleValue()
                                : 0;
                             double i2 =
                                p2.getPrix() != null
                                ? p2.getPrix().doubleValue()
                                : 0;
                             return i1 - i2;
                        }
                       });
    A+
    (\ _ /)
    (='.'=)
    (")-(")
    Deux règles du succès:
    1) Ne communiquez jamais à quelqu'un tout votre savoir...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Car il arrondi et du coup mon tri est moyen :

    Dans les logs, si j'affiche mes valeurs, j'ai :

    p1.getPrix()=4.936708860759493
    p2.getPrix()=15.822784810126583
    i2 - i1=15 - 4= 11


    Du coup voici ma liste triée par prix, le problème est en gras :

    15.822784810126583
    13.670886075949367
    9.620253164556962
    7.341772151898734
    6.329113924050633
    6.962025316455696

    5.443037974683544
    4.936708860759493
    4.6835443037974684
    4.430379746835443
    3.9240506329113924
    3.5443037974683547
    2.0253164556962027

  4. #4
    Membre actif Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Points : 221
    Points
    221
    Par défaut
    Mais dans ta classe Produit, le prix est bien en double? Car si c'est le cas je ne comprend pas pourquoi il arrondi...

    Vérifie bien que tout est passé en double...

    J'espère t'aider
    (\ _ /)
    (='.'=)
    (")-(")
    Deux règles du succès:
    1) Ne communiquez jamais à quelqu'un tout votre savoir...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Merci bcp ploxien.

    Oui le prix est bien en double dans la classe Produit.
    Quand je mets tout le comparator en double comme tu le suggérais j'ai l'errreur suivante :

    Le type de retour n'est pas compatible avec Comparator.compare(Object, Object)

    Dans le doute j'ai mis mais c'est pareil ..

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    On pourrait avoir le code de ta méthode compare() avec les double ?

    a++

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    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
    Collections.sort(
         (List) maListe,
         new Comparator() {
              public double compare(Object o1, Object o2) {
                   Produit p1 = (Produit) o1;
                   Produit p2 = (Produit) o2;
                   double i1 =
                        p1.getPrix() != null
    	       ? p1.getPrix().intValue()
                        : 0;
                   double i2 =
                        p2.getPrix() != null
    	       ? p2.getPrix().intValue()
                        : 0;
     
                   System.out.println("i2 - i1="+i2+" - "+i1+"= "+(i2 - i1));
     
                   return i2;
              }
         });

  8. #8
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ben tel quel c'est un peu normal que ça déconne ou je délire ? Parce que quand tu arrondis, tu risques d'avoir des comparaisons de deux double qui renvoient 0 alors que les deux doubles ne sont pas identiques, ce qui va te poser des problèmes dans ton classement.

    Pour quoi tu ne fais pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (i1==i2)
      return 0;
    if (i1<i2)
      return -1;
    return 1;
    Edit : j'ai posté en même temps que toi. La méthode que tu as posté est étrange ... compare ne peut pas renvoyer un double... Et en plus pourquoi tu renvoies i2 ??

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    la méthode compare() ne doit pas retourner un double mais un int qui doit correspondre aux valeurs -1, 0 ou 1 selon que le premier paramètre est plus petit, égal ou plus grand que le second...

    De plus tu utilises intValue() à la place de doubleValue() et donc c'est logique que tu perdes la précision...


    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
    		Collections.sort(
    				   (List) maListe,
     
    			     new Comparator() {
    			          public int compare(Object o1, Object o2) {
    			               Produit p1 = (Produit) o1;
    			               Produit p2 = (Produit) o2;
    			               double i1 =
    			                    p1.getPrix() != null
    				       ? p1.getPrix().doubleValue()
    			                    : 0.0;
    			               double i2 =
    			                    p2.getPrix() != null
    				       ? p2.getPrix().doubleValue()
    			                    : 0.0;
     
    				       		if (i1==i2) return 0;
    				       		if (i1<i2) return -1;
    				       		return 1;
    			          }
    			     });
    a++

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Tout à fait chtig, j'ai ecris n'importe quoi

    Voici ma méthode qui marche enfin

    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
     
    Collections.sort(
        (List) maListe,
        new Comparator() {
            public int compare(Object o1, Object o2) {
    	int retour=0;
    	Produit p1 = (Produit) o1;
    	Produit p2 = (Produit) o2;
     
    	if(p1.getPrix().doubleValue() < p2.getPrix().doubleValue())
    	    retour = 1;
    	if(p1.getPrix().doubleValue() > p2.getPrix().doubleValue())
    	    retour = -1;
     
    	return retour;
        }
    });

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Oui merci adiGuba, j'ai fait comme ça (voir au dessus)

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

Discussions similaires

  1. Trier une List contenant des noms et prénoms
    Par Jb_One73 dans le forum Général Java
    Réponses: 15
    Dernier message: 19/02/2015, 15h19
  2. Réponses: 1
    Dernier message: 23/03/2013, 13h26
  3. Trier une liste d'objets d'après un champ des objets
    Par gids01 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 02/07/2007, 09h52
  4. [c#] Trier une liste de nombres liés.
    Par Joad dans le forum ASP.NET
    Réponses: 13
    Dernier message: 11/05/2005, 11h17
  5. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 12h44

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