Question sur l'interface comparable en java

Fermé
luna sarita - 8 nov. 2012 à 12:20
 luna sarita - 8 nov. 2012 à 15:13
Bonjour,

j'ai un programme que j'arrive pas à comprendre le voici mais ce que je ne comprend pas c'est la ligne en gras avec le mot clé comprarable sachant que mon sous programme recherche une valeur dans un arbre an faisant un parcours préfixé je sais que dans la ligne que je ne comprend pas il compare la valeur de la racine de l'arbre a la valeur passé comme parametre dans le sous programme mais je connais pas comparable est ce que c'est une classe et comment ça fonctionne? merci


public boolean recherchePréfixé(Object val, Arbre b) {
boolean resultat=false;

if (b==null) resultat=false ; //condition d'arrêt
else {

if (((Comparable)val).compareTo(b.getValeur().toString())==0) { //on teste d'abord la racine
resultat=true;
b.trouve=true; //variable permettant de dire que le noeud est le bon
b.parcouru=false;
}
else { //on continue la recherche après

b.parcouru=true; //variable permettant de repérer que le noeud a été comparé

//si pas de fils gauche on regarde à droite
if (b.filsg==null) resultat=recherchePréfixé( val, b.filsd);

//si pas de fils droit on regarde à gauche
else if (b.filsd==null) resultat=recherchePréfixé( val,b.filsg);

//si on a les 2 on regarde d'abord à gauche puis à droite
else resultat=((recherchePréfixé( val, b.filsg)) || (recherchePréfixé( val, b.filsd)));

}
}
return resultat;
}
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
8 nov. 2012 à 12:25
val est un Object, mais tu utilises la méthode compareTo qui n'existe pas dans Object, donc ton code ne marchera que si val est un objet bien particulier qui possède la méthode compareTo, c'est à dire qui implémente Comparable. Donc ce que tu fais ici, c'est que tu précises que val est un Comparable, ce qui fera ce que tu veux si c'est bien un Comparable, mais plantera en général.

En fait le mieux ce serait d'écrire recherchePréfixé(Comparable val, Arbre b), comme ça il n'y aurait plus de problème, mais quand on manipule les arbres on est en général beaucoup plus précis en faisant des trucs comme recherchePréfixé(T val, Arbre<T> b), avec T qui implémente Comparable<T>, mais je ne sais pas si tu as déjà vu ça.
0
non j'ai pas vu ça auparavant c'est la première fois que je manipule les arbres je vais essayer de baser mes recherches sur ce que tu viens de dire merci beaucoup
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
8 nov. 2012 à 14:24
En gros l'idée c'est qu'un arbre ne peut pas manipuler tout et n'importe et quoi, il faut que les données soient toutes de même type (que l'on appelle génériquement T) et que de plus on soit capable de comparer chaque élément à un autre de même type (dire s'il est plus petit, ou plus grand), c'est pour cela que T ne doit pas être un Object quelconque mais un Comparable<T>.

La déclaration de ta classe Arbre devrait donc être un peu plus compliquée, mais ça permet d'être plus rigoureux dans l'utilisation des données.

Remarque : recherchePréfixé devrait s'appliquer sur l'arbre courant this, et pas sur l'arbre b passé en paramètre, ou alors la méthode doit être déclarée static (puisque this n'est pas utilisée).

public class Arbre<T extends Comparable<T>>
{
    public T getValeur();

    //public boolean recherchePréfixé(T val, Arbre<T> b);
    public boolean recherchePréfixé(T val); // plus logique
    //public static <T extends Comparable<T>> boolean recherchePréfixé(T val, Arbre<T> b); 
}
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
8 nov. 2012 à 14:36
Remarque : quand je vois ton code, je n'ai pas l'impression que ton arbre soit trié, tu as l'air d'y mettre des données n'importe comment, dans ce cas tu peux oublier les Comparable (au moins pour l'instant), et remplacer x.compareTo(y)==0, par x.equals(y), ce qui fonctionnera avec tous les Object.
0
oh merci beaucoup pour cette explication avec equals ça marche très bien merci
0