01. marts 2002 - 10:40Der er
8 kommentarer og 1 løsning
Optælling af forskellige ord
Jeg har en tekst med ca. 1500 linjer. I hver linje står et navn på en virus. Jeg opbygger en Listbox med navnene på de FORSKELLIGE vira i teksten. Mit spørgsmål er: Hvordan får jeg hurtigst optalt hvor mange forekomster der er af de forskellige vira i teksten?
De fleste virksomheder har efterhånden bevist, at AI virker.
Pilotprojekter leverer resultater. Medarbejdere bruger generative AI-værktøjer. Nye use cases dukker op på tværs af organisationen.
type TForm1 = class(TForm) ListBox1: TListBox; Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); procedure ListBox1Click(Sender: TObject); private Procedure AddToListBox(const s : String); public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
Type TVirusObject = class private FCount: Integer; FName: String; procedure SetCount(const Value: Integer); procedure SetName(const Value: String); public property Count : Integer read FCount write SetCount; property Name : String read FName write SetName; end;
{ TVirusObject }
procedure TVirusObject.SetCount(const Value: Integer); begin FCount := Value; end;
procedure TVirusObject.SetName(const Value: String); begin FName := Value; end;
procedure TForm1.AddToListBox(const s: String); var i : Integer; VirusObject : TVirusObject; begin i := ListBox1.Items.IndexOf(s); if i = -1 then begin VirusObject := TVirusObject.Create; VirusObject.Count := 1; VirusObject.Name := S; ListBox1.Items.AddObject(VirusObject.Name, VirusObject); end else begin VirusObject := TVirusObject(ListBox1.Items.Objects[i]); VirusObject.Count := VirusObject.Count +1; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin AddToListBox(Edit1.Text); end;
type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } Function CountTimes(ViraName:string; IgnoreCase:Boolean; SearchText:Tlistbox):integer; end;
var Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
function TForm1.CountTimes(ViraName: string; IgnoreCase: Boolean; SearchText: Tlistbox): integer; Var I:integer; begin result := 0; for I := 0 to SearchText.Count-1 do begin if IgnoreCase then begin if pos(lowercase(ViraName),lowercase(SearchText.Items.Strings[I])) <> 0 then result := result+1; end else if pos(ViraName,SearchText.Items.Strings[I]) <> 0 then result := result+1; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin showmessage(inttostr(CountTimes('test', true, ListBox1))); end;
dkn >> Din løsning virker ikke fordi nca, kun har de forskellige navne i listboxen. I øvrigt er det ikke en god løsning at skulle tælle hvergang man skal bruge antallet. :-)
Du bør i øvrigt kigge på Object orienteret programmering :-(
jens b>> Jeg tog programmet med hjem. Dit forslag fungerer fint, men da jeg kun havde tænkt mig at vise de 10 oftest forekommende vira, har jeg brug for at få sorteret den endelige liste. Har du også et bud på det?
Jeg har løst problemet ved at fylde yderligere en listbox, denne gang med antal forekomster og så sat sorted=true. Måske findes der en mere elegant løsning?
ja der er en mere elegang løsning ..... Stop dine ting i en TListView i stedet for ... Der kand du selv bestemme hvordan der skal sorteres.
Jens B
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.