Bonjour,

J'ai beaucoup de mal à implémenter les structures de données que je souhaite en java. Je ne sais pas si le problème vient de moi où du langage, mais je me sens beaucoup plus à l'aise dans d'autres langages.

Ma structure de donnée est celle-là (en Caml / F#) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
type 'a ast =
  | Op of ('a -> 'a -> 'a) * 'a ast * 'a ast
  | Val of 'a
En clair, c'est un arbre binaire où les nœuds sont des fonctions (à 2 arguments) et les feuilles des valeurs. Je souhaite que mon type reste générique, de sorte que les feuilles puissent être des entiers, des flottants, des strings ou autres.

Par la suite, je souhaite pouvoir évaluer l'arbre. Code en ml/F# :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
let rec eval = function
  | Op (f, x, y) -> f (eval x) (eval y)
  | Val n -> n
Et pour tester, j'aimerais pouvoir entrer en arbre en dur, de façon assez claire et lisible. J'avais écrit ça en Caml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
let make v1 f v2 = Op (f, v1, v2)
and (!) n = Val n
 
let my_ast = make
    (make !3 (+) !2)
    (-)
    (make !40 (/) !10)
Bien sûr, j'ai cherché sur google et lu la faq. J'ai quand même plusieurs questions :

. quelle est la solution la plus simple pour modéliser l'arbre ? De ce que j'ai lu, il faudrait faire une classe abstraite et deux classes qui en héritent.

. a priori, je devrais utiliser une interface pour les fonctions de l'arbre (pour remplacer les pointeurs sur fonction). C'est bien ça ? Et c'est possible de faire ça en mélangeant avec les generics ? (j'avoue que je ne vois pas trop comment faire)

. enfin, je dois vraiment créer un objet pour chaque fonction que je veux ajouter ? Je trouve ça excessivement lourd, surtout quand c'est une simple addition ou une soustraction.

Question subsidiaire : vous pensez que c'est possible de convertir mes 10 lignes de ml en moins de 50 lignes de java ?


Par avance, merci de vos réponses.