2010-01-28 3 views

Répondre

2

Voici une sorte de méthode de force brute de le faire. il utilise une liste de chaînes et stocke le nombre de mots cast en tant qu'objet dans l'élément de liste.

var 
    i : integer; 
    iCount : integer; 
    idxFound : integer; 
    someText : string; 
    s : TStringList; 
    oneWord : string; 

begin 
    someText := 'this that theother and again this that theother this is not that'; 
    oneWord := ''; 

    s := TStringList.Create; 
    for i := 1 to length(someText) do begin 
    if someText[i] = ' ' then begin 
     idxFound := s.indexof(oneWord); 
     if idxFound >= 0 then begin 
     iCount := integer(s.objects[idxFound]); 
     s.Objects[idxFound] := TObject(iCount + 1); 
     end 
     else begin 
     s.AddObject(oneWord, TObject(1)); 
     end; 
     oneWord := ''; 
    end 
    else begin 
     oneWord := oneWord + someText[i]; 
    end; 
    end; 

    if oneWord <> '' then 
    if idxFound >= 0 then begin 
     iCount := integer(s.objects[idxFound]); 
     s.Objects[idxFound] := TObject(iCount + 1); 
    end 
    else begin 
     s.AddObject(oneWord, TObject(1)); 
    end; 

    // put the results on the screen in a text box. 
    memo1.Text := ''; 
    for i := 0 to s.Count - 1 do 
    memo1.Lines.Add(intToStr(integer(s.Objects[i])) + ' ' + s[i]); 
+0

s'il s'agit d'une liste de chaînes triées, vous pouvez utiliser "s.find" au lieu de "s.indexof". Vous pouvez également définir la sensibilité à la casse de la liste de chaînes en fonction de votre implémentation. –

+0

Merci Don: c'est exactement ce que je veux faire! Est-il possible d'utiliser un délimiteur différent (en plus de l'espace '')? –

+0

bien sûr, il suffit de changer la ligne: si someText [i] = '' alors commencez pour vérifier quel (s) délimiteur (s) vous voulez –

0

Je ne me souviens pas des fonctions Delphi intégrées qui le font directement. Mais une simple méthode O (n * Log (n)) serait de trier les mots puis de les scanner et de les compter.

+0

Salut Mark: pourriez-vous s'il vous plaît me donner un exemple de la mise en œuvre? –

+0

@ mo3ez: Désolé - je n'ai pas le temps disponible en ce moment. Cependant, le compte des mots de Marco est un bon début pour l'analyse des mots. Mettez les mots individuels dans un tableau et triez-les. Voir le post SO http://stackoverflow.com/questions/41733/best-way-to-sort-an-array-in-delphi pour un bon exemple de tri. –

0

Si nous parlons du nombre de mots dans une chaîne de texte, ce que vous pourriez faire était d'analyser la chaîne, et d'identifier les mots. Ajoutez les mots à une carte, où l'identificateur est le mot lui-même, et la valeur un nombre. Ce nombre est augmenté si le mot que vous trouvez dans la chaîne existe déjà dans la carte.

map<string, int> 
foreach word in string 
    if word is in map 
     map[word] = map[word] + 1 
    else 
     map[word] = 1 
    end if 
end for 

Puisque je ne connais pas bien Delphi, j'ai essayé de vous fournir un exemple de pseudo-code.

-1

de la bibliothèque de la FPC:

function WordCount(const S: string; const WordDelims: TSysCharSet): Integer; 

var 
P,PE : PChar; 

begin 
    Result:=0; 
    P:=Pchar(pointer(S)); 
    PE:=P+Length(S); 
    while (P<PE) do 
    begin 
    while (P<PE) and (P^ in WordDelims) do 
     Inc(P); 
    if (P<PE) then 
     inc(Result); 
    while (P<PE) and not (P^ in WordDelims) do 
     inc(P); 
    end; 
end; 

wordcount (test, [ ' '! '','', '', '', # 10, # 13]); serait une bonne première tentative. Cela signifiait pour des calculs de magnitude simple, car il p. Ex. ne prend pas soin des mots abrégés.

Bien sûr, si vous le présentez comme devoir, il vous sera probablement demandé d'expliquer son fonctionnement.

+1

Alors que cet exemple comptera le nombre de mots dans une chaîne, il ne comptera pas le nombre d'occurrences de chaque mot, comme l'auteur l'a demandé. Il devrait être capable de cela, bien que quelques ajustements mineurs soient apportés. –

+0

Merci Marco. À quoi sert le deuxième paramètre? Comment puis-je lister tous les mots «uniques» d'un texte, puis les transmettre un par un à la fonction afin d'obtenir les statistiques dont j'ai besoin (occurrences par mot). –

0

un TSTListe peut également être utilisé pour la "liste de mots". Exécutez tous vos mots et ajoutez chacun à la liste tString en tant que nouvel élément. Lorsque vous avez terminé, vous avez un compte TOTAL, pour déterminer les mots uniques, trier la liste, et dans une boucle, voir si le mot actuel est différent du mot précédent ... si c'est le cas, incrémenter le nombre de mots uniques.

Questions connexes