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

avec Java Discussion :

Pourquoi les List n'ont pas besoin de Comparable contrairement au Set?


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut Pourquoi les List n'ont pas besoin de Comparable contrairement au Set?
    C'est une question que je me suis posé après avoir vu des annales de mon université.

    Pourquoi les List n'ont pas besoin de Comparable contrairement au Set?


    Par exemple avec ce code:

    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
     
    class Personnels implements Comparable, PersonnelsStandard{
        	int no;
        	int anciennete;
        	String nom;
        	String adresse;
        	ElementsSalaire es;
        	HistoriqueServices histo;
        	Personnels(int no,String n,String a, int base,int anc){
        		this.no=no; à compléter
        	}
        	public String toString(){
        		return no + " " + nom + " " + " base "+ es.salaireBase+" Primes " + es.primes + " sal. Total "+es.salaireTotal()+
        	" Histo Serv. "+historique();
        	}
        	public List historique(){
        	return histo.services;}
        	public void ajoutHistorique(Sites s){histo.services.add(s);}
        	public void ajoutPrime(String pr){
        		if (pr=="PA") {es.primes.add(es.new PrimeAnciennete(this));}
        		if (pr=="PR") {es.primes.add(es.new PrimeResultat(this));}
        	}
        	public void suppressionPrime(String pr){
        		à compléter
        	}
        	public int compareTo(Object o){
        		return(no-((Personnels)o).no);
        	}
     
    private class ElementsSalaire{
        	int salaireBase;
        	List primes;
        	ElementsSalaire(int  b){salaireBase=b;primes= new ArrayList();}
        	int salaireTotal(){
        	int x=0;
        	for (int i=0;i<primes.size();i++)x=x+((Prime)(primes.get(i))).montant;
        	return salaireBase+x;}
     
    class PrimeAnciennete extends Prime{ 
    	PrimeAnciennete(Personnels p){
    	super(p);type="PA";calculPrime();
    	}
     
    void calculPrime(){
    	montant=(int)(p.es.salaireBase*anciennete*0.02);
    	}
     
    public String toString(){return "PA= "+montant;}
    }
    class PrimeResultat extends Prime{ PrimeResultat(Personnels p){
    super(p);type="PR";calculPrime();
    }
    void calculPrime(){
    	montant=(int) (p.es.salaireBase*0.05);
    }
    public String toString(){
    	return type+" "+montant;}
    }
    }
    class HistoriqueServices{
    	List services;
    	HistoriqueServices(){services= new ArrayList();}
    	}
    }
     
    abstract class Prime implements Comparable{
    	Personnels p;
    	int montant; String type;
    	static List L=new ArrayList(); Prime(Personnels p){this.p=p;L.add(this);}
    	abstract void calculPrime();
    	public String toString(){return type;}
    	public int compareTo(Object o){return montant - ((Prime)o).montant;}
    }
    compareTo() n'est pas obligatoire pour la classe Prime (car les primes sont ajoutées à une collection (List) de la classe interne ElementsSalaire de Personnels). Les instances de Personnels sont ajoutées à une collection de type Set, compareTo() est nécessaire.

    Pourtant Prime impélmente Comparable! Tout comme Personnels!

    Je suis prêts à recevoir vos lumières qui éclaireront mon obscure pensée

  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
    Non, les Set n'ont pas besoin que les instances soient Comparable, je ne sais pas d'où tu sort cette idée. Le HashSet exige seulement que les données soient immuable au regard de equals et hashcode.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 458
    Points
    458
    Par défaut
    Un Set garanti qu'il n'y a pas de doublon dans ta collection.

    Le HashSet utilise une table de hachage donc la méthode hashcode() et equals().
    Pas besoin pour la compilation que tes objets implémentent une interface puisque se sont des méthodes définis dans la classe Object.
    Dès que tu ajoutes une valeur et qu'il y a une collision, la nouvelle valeur remplace l'ancienne.

    Le TreeSet utilise un arbre binaire et place les éléments soit via un Comparator que tu lui passes dans le constructeur, soit par la méthode compare() donc dans ce cas les éléments que tu ajoutes doivent implémenter Comparable.

    Tu n'auras pas d'erreur a la compilation il me semble, mais sous Java 6 dès que tu vas ajouter une seconde valeur sans Comparator qui n'est pas Comparable, tu auras une ClassCastException qui va être levé. Sous Java 7, c'est dès la première insertion.

    Aucun de ces tests n'est effectués dans une liste.

  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
    Le TreeSet est un SortedSet, c'est à dire un Set avec un ordre garanti. Dès qu'un ordre doit être garanti, il faut un moyen d'établir cet ordre. En java c'est typiquement Comparator / Comparable.

  5. #5
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut
    Merci beaucoup! C'était ma dernière question d'examen, je pense l'avoir réussi grâce à vous!

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

Discussions similaires

  1. Les stations n'ont pas accès au domaine
    Par Jean-Claude Dusse dans le forum Windows Serveur
    Réponses: 6
    Dernier message: 08/01/2009, 17h03
  2. Pourquoi les GOTO ne sont pas appréciés ?
    Par Hoffa dans le forum Débuter
    Réponses: 6
    Dernier message: 29/10/2008, 12h54
  3. Réponses: 3
    Dernier message: 27/08/2007, 23h35
  4. Réponses: 4
    Dernier message: 13/03/2007, 12h19
  5. Réponses: 10
    Dernier message: 11/03/2007, 12h33

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