Avatar billede nca Juniormester
01. marts 2002 - 10:40 Der 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?
Avatar billede borrisholt Novice
01. marts 2002 - 10:45 #1
send lige filen til jens@borrisholt.com så skal jeg lave dig en løsning :-)

Jens B
Avatar billede borrisholt Novice
01. marts 2002 - 11:18 #2
prøv noger alla det her :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

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;

procedure TForm1.ListBox1Click(Sender: TObject);
var
  VirusObject : TVirusObject;
begin
  VirusObject := TVirusObject(ListBox1.Items.Objects[ListBox1.ItemIndex]);
  Caption := Format('Navn : %s --||-- Forkomster : %d',[VirusObject.Name, VirusObject.Count]);
end;

end.



Jens B
Avatar billede dkn Nybegynder
01. marts 2002 - 11:31 #3
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

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;

end.
Avatar billede borrisholt Novice
01. marts 2002 - 12:53 #4
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
Avatar billede borrisholt Novice
01. marts 2002 - 12:54 #5
Hov den mund vendte forkert :-) og ikke :-(

jens B
Avatar billede nca Juniormester
01. marts 2002 - 12:59 #6
jens b>>
Det ser meget spændende ud. Jeg går til weekend nu, så du får først dine point på mandag, når jeg har testet dit løsningsforslag.
Avatar billede nca Juniormester
01. marts 2002 - 14:43 #7
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?
Avatar billede nca Juniormester
01. marts 2002 - 19:32 #8
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?
Avatar billede borrisholt Novice
04. marts 2002 - 08:50 #9
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester