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 :

Problème pour implémenter l'interface Comparable


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut Problème pour implémenter l'interface Comparable
    Bonjour à tous

    Mon problème est très simple, je veux implémenter l'interface Comparable pour une classe qui contient une liste. J'essaie de faire comme ç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
    public Class QValue implements Comparable{
     
        List<Double> val = new ArrayList<Double>();
     
       //constructeur etc
     
        public int compareTo(Object o) {
            QValue v = (QValue) o;
            if (this.val.size() == v.val.size()) {
                if(this.val.get(0) < v.val.get(0)) return -1;
                else if(this.val.get(0) > v.val.get(0)) return 1;
                else return 0;
            } else if (this.val.size() > v.val.size()) {
                return (1);
            } else return -1;
        }
    }
    Et ça plante lamentablement, je peux accéder à v.val.size, mais pas à v.val.get(0)

    Auriez-vous une solution ?

    Merci d'avance

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    votre liste est probablement vide.

    Et votre critère de comparaison est curieux.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    Le probleme vient à la compilation, pas au runtime, je ne pense pas que le remplissage de la liste soit en cause.

    Je suis d'accord que la comparaison n'est pas efficace, on m'impose cette méthode.

    Le message d'erreur est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    operator < cannot be applied to java.lang.Object,java.lang.Double
    if(this.val.get(0) < v.val.get(0)) return -1;
    Je te remercie de m'aider

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    heu, vous déclarer que o est de type QValue alors que vous comparer avec un classe appelée test. Et il semble que "val" dans QValue soit de type List<Object>

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    Oui pardon, j'ai écris que la classe s'appelle "test" un peu à la va vite, en fait elle s'appelle "QValue". Je vais modifier ça dans mon exemple.

    C'est vrai que c'est un peu hasardeux d'implémenter la méthode compareTo avec un Object en paramètre, il aurait été plus judicieux de le faire en prenant directement un objet de type QValue.

    En fait, ma classe implémente l'interface Comparable, c'est pour ça que la méthode compareTo a cette signature. Je pensais que c'était une bonne idée d'implémenter une interface "standard", mais peut-être vaut-il mieux que je redéfinisse une interface pour la comparaison ?

    Peut-être aussi que je définis mal ma List<Double> et Java voit une List<Object>, je ne comprend pas trop pourquoi ni comment améliorer cela.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par scheme Voir le message
    Oui pardon, j'ai écris que la classe s'appelle "test" un peu à la va vite, en fait elle s'appelle "QValue". Je vais modifier ça dans mon exemple.
    Le problème c'est que le code que vous donnez maintenant ne peut pas retourner l'erreur de compilation que vous donnez.

    Veuillez donc nous donner votre code réel et l'erreur que vous avez, merci.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    edit: post supprimé.

  8. #8
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Pourquoi ne pas utilser le equals de la classe 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
    19
    20
    21
    22
    public Class QValue implements Comparable{
     
    	List<Double> val = new ArrayList<Double>();
     
    	//constructeur etc
     
    	public int compareTo(Object o) {
    		QValue v = (QValue) o;
     
    		//prévoir test si val ou o est null
     
    		if (this.val.isEmpty() == false && this.val.size() == v.val.size() && this.val.get(0) != null) {
    			return this.val.get(0).equals(v.val.get(0));
     
    		} else if (this.val.size() > v.val.size()) {
    			return 1;
     
    		} else {
    			return -1;
    		}
    	}
    }

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    C'est surement une bonne idée, mais quand tu écris ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return this.val.get(0).equals(v.val.get(0));
    Premièrement, ça retourne un boolean et pas un int, mais on pourrait contourner. Ce qui est plus génant c'est que ça test si les valeurs sont égales, pas quelle valeur est la plus grande. Ce qui bloque je pense, c'est l'utilisation des opérateurs < et >, je ne vois pas trop comment procéder

  10. #10
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Citation Envoyé par scheme Voir le message
    C'est surement une bonne idée, mais quand tu écris ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return this.val.get(0).equals(v.val.get(0));
    Premièrement, ça retourne un boolean et pas un int, mais on pourrait contourner. Ce qui est plus génant c'est que ça test si les valeurs sont égales, pas quelle valeur est la plus grande. Ce qui bloque je pense, c'est l'utilisation des opérateurs < et >, je ne vois pas trop comment procéder
    Bien vu et je m'excuse, j'avais en tête la méthode compareTo et j'ai écrit trop vite equals. Remplacez donc ce que j'ai écrit plus haut par compareTo.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    Merci beaucoup à tous les deux, ça fonctionne très bien maintenant !

    J'aimerais bien avoir une explication sur la nécessité de déclarer la liste de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected List<Double> l_val= new ArrayList<Double>();
    J'ai lu à plusieurs endroits que Java faisait le cast tout seul et que c'était la nouvelle façon d'utiliser les lists depuis java 5, en réalité il n'en est rien ?

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Février 2008
    Messages
    658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 658
    Par défaut
    Citation Envoyé par scheme Voir le message
    Bonjour à tous


    [code]public Class QValue implements Comparable{

    List<Double> val = new ArrayList<Double>();

    Merci d'avance
    Tu avais aussi ecrit Class au lieu du mot class, donc le compilateur ne le verra pas;

    Pour eviter le cast, je te propose comme ç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
     
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class QValue implements Comparable<QValue> {
     
    	List<Double> val = new ArrayList<Double>();
     
    	public int compareTo(QValue otherQvalue) {
     
    		return (this.val.size() == otherQvalue.val.size()) ? ((this.val.get(0) - otherQvalue.val.get(0)<0)?-1:1)
    				                                           : this.val.size() - otherQvalue.val.size();
     
    	}
     
     
    }

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

Discussions similaires

  1. [Swing/Netbeans] Problème pour organiser l'interface
    Par ggvert dans le forum Débuter
    Réponses: 2
    Dernier message: 27/05/2010, 23h29
  2. [AC-2007] Problème pour masquer l'interface Access en VBA
    Par tienous dans le forum VBA Access
    Réponses: 1
    Dernier message: 26/01/2010, 20h24
  3. Problème pour implémenter une Interface
    Par Freud44 dans le forum C#
    Réponses: 2
    Dernier message: 20/11/2009, 13h56
  4. Problème d'implémentation d'interface
    Par Erazion dans le forum C#
    Réponses: 2
    Dernier message: 17/09/2009, 10h01
  5. Problème d'implémentation d'interface
    Par gamisne dans le forum C#
    Réponses: 3
    Dernier message: 25/08/2008, 16h32

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