vb95
Messages postés3440Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention29 novembre 2023
-
Modifié le 3 avril 2018 à 04:19
vb95
Messages postés3440Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention29 novembre 2023
-
3 avril 2018 à 18:40
Bonjour à tous !
Dans un projet j'ai cette fonction qui me retourne Vrai ou Faux selon si un mot est présent dans un dictionnaire .
Le dictionnaire est formé de nœuds qui sont des objets ClassNoeudWhis et contenu dans la list( Of Dico.NoeudsDictionnairesWhis)
'Cette fonction teste si un mot est présent dans le dictionnaire
Private Function MotAdmisWhis(MotSaisi As String) As Boolean
Dim Lettre As String, Index As Integer
Dim NoeudCourant As ClassNoeudWhis = Dico.NoeudsDictionnairesWhis(0) ' <---------c'est ici
'La fonction utilise le mot à tester comme un chemin dans le DAWG à partir du noeud racine
For i = 0 To TailleMot - 1
Lettre = MotSaisi.Substring(i, 1)
Index = NoeudCourant.Sortants.FindIndex(Function(p) p.Lettre = Lettre)
If Index = -1 Then
For j = i To TailleMot - 1
StringNoeuds = StringNoeuds & "????----->"
Positions(j) = StringNoeuds.Length - 4
Next j
Return False
End If
StringNoeuds = StringNoeuds & NoeudCourant.Numero.ToString & "----->"
Positions(i) = StringNoeuds.Length - 4
NoeudCourant = NoeudCourant.Sortants(Index).Destination
Next i
'Si le chemin est valide et s'il aboutit à un noeud terminal c'est que le mot existe dans le dictionnaire
If NoeudCourant.IsTerminal = True Then StringNoeuds = StringNoeuds & NoeudCourant.Numero.ToString & "=terminal"
Return NoeudCourant.IsTerminal
End Function
J'ai une seconde fonction qui fait exactement le même travail
Private Function MotAdmisKarl(MotSaisi As String) As Boolean
La seule ligne qui change est la seconde ligne dans le corps des 2 fonctions
Dim NoeudCourant As ClassNoeudWhis = Dico.NoeudsDictionnairesWhis(0)
qui devient
Dim NoeudCourant As ClassNoeudKarl = Dico.NoeudsDictionnairesKarl(0)
ClassNoeudKarl est la classe pour les nœuds du dictionnaire sous une autre forme et le dictionnaire complet est content dans la List( Of Dico.NoeudsDictionnairesKarl )
C'est idiot de copier 2 fois le même code à une ligne près .
Comment faire pour n'avoir plus qu'une seule fonction dans le projet pour les 2 formats de dictionnaire sachant que les 2 classes ClassNoeudKarl et ClassNoeudWhis bien qu'assez similaires doivent restées séparées ?
J'ai essayé en mettant Mode en paramètre à l'appel pour le fonction commune
Dim NoeudBase as Object = Nothing
If Mode= "W" then
NoeudCourant = Ctype(NoeudBase,classNoeudWhis)
NoeudCourant = Dico.NoeudsDictionnairesWhis(0)
Else
NoeudCourant = Ctype(NoeudBase,classNoeudKarl)
NoeudCourant = Dico.NoeudsDictionnairesKarl(0)
End if
Mais j'ai un problème de liaison tardive que je n'arrive pas à régler
Merci aux personnes qui liront ce post et à ceux qui tenteront de me donner une solution !
Je continue à chercher de mon côté et merci d'avance
vb95
Messages postés3440Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention29 novembre 2023165 Modifié le 3 avril 2018 à 05:25
bonjour à tous
Je me réponds à moi-même car j'ai trouvé une solution très satisfaisante
1) J'ai fusionné les 2 classes Nœud en une seule
2) Le code la fonction est ici
En entrée
- MotSaisi = mot saisi au clavier pour test
- Mode = "W" ou "K" selon le dictionnaire choisi
- Nœuds = List (Of ClassNoeud) du dictionnaire choisi ( les nœuds du dictionnaire )
'Cette fonction teste si un mot est présent dans le dictionnaire
Private Function TestemotAdmis(MotSaisi As String, Mode As String, Noeuds As List(Of ClassNoeud)) As Boolean
Dim Lettre As String, Index As Integer
Dim NoeudCourant As ClassNoeud = Noeuds(0)
'La fonction utilise le mot à tester comme un chemin dans le DAWG à partir du noeud racine
For i = 0 To TailleMot - 1
Lettre = MotSaisi.Substring(i, 1)
If Mode = "W" Then
Index = NoeudCourant.SortantsWhis.FindIndex(Function(p) p.Lettre = Lettre)
Else
Index = NoeudCourant.SortantsKarl.FindIndex(Function(p) p.Lettre = Lettre)
End If
If Index = -1 Then
For j = i To TailleMot - 1
StringNoeuds = StringNoeuds & "????----->"
Positions(j) = StringNoeuds.Length - 4
Next j
Return False
End If
StringNoeuds = StringNoeuds & NoeudCourant.Numero.ToString & "----->"
Positions(i) = StringNoeuds.Length - 4
If Mode = "W" Then
NoeudCourant = NoeudCourant.SortantsWhis(Index).Destination
Else
NoeudCourant = NoeudCourant.SortantsKarl(Index).Destination
End If
Next i
'Si le chemin est valide et s'il aboutit à un noeud terminal c'est que le mot existe dans le dictionnaire
If NoeudCourant.IsTerminal = True Then StringNoeuds = StringNoeuds & NoeudCourant.Numero.ToString & "=terminal"
Return NoeudCourant.IsTerminal
End Function
Cette approche ne convient parfaitement et je mets donc ce post en résolu
vb95
Messages postés3440Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention29 novembre 2023165 3 avril 2018 à 18:40
Bonjour
Vu la fusion des 2 anciennes ClassNoeudWhis et ClassNoeudKarl en une seule je n'utilise plus qu'un seul dictionnaire NoeudsDictionnaires et non 2 ( NoeudsDictionnairesWhis et NoeudsDictionnairesKarl)
Le code du projet a donc été mis à jour