Entwickler-Ecke

Sonstiges (Delphi) - Suchen eines wortes aus einer Listbox


Budo - Mo 21.11.05 09:15
Titel: Suchen eines wortes aus einer Listbox
hallo habe mal eine frage, ich habe eine sehr lange Listbox und in dieser möchte ich ein eingefügtes wort suchen. Die Listbox ist alphabetisch sortiert daher habe ich mir schon überlegt, das die suche erstmal die hälfte befragt zb. a-m und dadurch schon die hälfte ausschliesst damit nicht jedes wort abgefragt werden muss und dann so weiter. Das problem ist nur welchen befehl muss ich da angeben? bitte um hilfe.
danke


opfer.der.genauigkeit - Mo 21.11.05 09:18

Also prinzipiell kannst du mit dem Methodenaufruf "IndexOf( 'Value' );" den Index deines gesuchten Elements herausfinden.


Blackheart666 - Mo 21.11.05 09:45

Gruss !
Vieleicht nicht ganz das was Du suchst aber geht.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function WortSuche(Wort:String;Liste:Tstrings):integer;
var
i:Integer;
 begin
 result:=-1;
 for i:=0 to Liste.count-1 do
  if Wort=Liste[i] then begin
   result:=i;
    exit;
  end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
 Listbox1.itemindex:=WortSuche(Edit1.Text,Listbox1.items);
end;


Budo - Mo 21.11.05 21:47

also ich möchte gerne mit nem edit-feld und einem button arbeiten also BtSuchen... und das man halt das wort im edit-feld angibt und dann sucht. mit zB einer anzeige wort vorhanden oder nichtvorhanden.
danke


alzaimar - Mo 21.11.05 22:13

Solche Sachen sind meistens schon eingebaut, wie das opfer.der.genauigkeit schon treffend feststellte.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Procedure TForm1.btSuchenClick (Sender : TObject);
Var
  i : Integer;

Begin
  i := MyListBox.Items.IndexOf (MyEdit.Text);
  if i=-1 Then
    Raise Exception.CreateFmt ('Suchbegriff "%s" wurde nicht gefunden, [MyEdit.Text]);
  MyListBox.ItemIndex := i;
End;

Deine Idee am Anfang ist sehr gut und nennt sich 'binary search'. Oder "binäre Suche". http://www.sortieralgorithmen.de/binarysearch/index.html


Budo - Di 22.11.05 22:26

vielen danke jetzt funktioniert es!!!
danke danke danke


Budo - Mi 23.11.05 12:08


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure Tmain.BtSuchenClick(Sender: TObject);
var a,b,s:Integer;
 begin
  a:=0;
  b:=ListBox1.Items.Count-1;
  repeat
  s:=(a+b) div 2;
    if Listbox1.items[s] <> Ed1.Text then
      s:=a
        else s:=(a+b) div 2;
    until (a+b) div 2 = a;
      if  Ed1.text = Listbox1.items [s] then
           Listbox1.items [s]:=Ed1.Text;
end;


die suche mit der function hat funktioniert allerdings hat diese zu lange gebraucht, da die liste zu viele einträge hat. trotzdem danke.

jetzt habe ich versucht eine binäre Suche zu erstellen, habe allerdings Probleme dies mit den Variablen umzusetzen.
Bitte um Hilfe!Danke!

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.


alzaimar - Mi 23.11.05 12:49

Wieviele Einträge sind denn in der Liste? Normalerweise sollte das suchen in ein paar 10000 Einträgen max. 100ms dauern und das ist schon pessimistisch.

Die Liste muss sortiert sein, damit die Binärsuche funktioniert. Die ist aber auch in TStringList eingebaut. Schau mal nach. Eventuell klappt es, TStringList (ListBox.Items).Sorted := True; zu schreiben und dann per 'IndexOf' das Element zu suchen.


Budo - Mi 23.11.05 13:54

die liste ist schon sortiert aber trotz der kurzen zeit möchte ich eine binärsuche erstellen das muss doch möglich sein oder?


Budo - Mi 23.11.05 21:34

ist den mein ansatz total falsch? ich glaube ich habe nur dreher in den variablen oder? bitte um hilfe! Danke




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
 procedure Tmain.BtSuchenClick(Sender: TObject);  
var a,b,s:Integer;  
 begin  
  a:=0;  
  b:=ListBox1.Items.Count-1;  
  repeat  
  s:=(a+b) div 2;  
    if Listbox1.items[s] <> Ed1.Text then  
      s:=a  
        else s:=(a+b) div 2;  
    until (a+b) div 2 = a;  
      if  Ed1.text = Listbox1.items [s] then  
           Listbox1.items [s]:=Ed1.Text;  
end;


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


Grishnak - Do 24.11.05 00:01

Die "IndexOf()"-Methode einer TStringList verwendet für die Suche in einer sortierten Liste einen Binärsuch-Algorithmus!


Budo - Fr 25.11.05 15:54

und wie funktioniert das??? versteh es nicht ganz!


Martin1966 - Fr 25.11.05 15:58

Naja, einfach die Methode IndexOf verwenden... den Rest übernimmt Delphi bzw. die Klasse für dich.

Lg Martin


Budo - Mi 30.11.05 12:28

ich liege doch richtig damit dass ich eine procedure zur suche erstellen muss
mir ist die Indexof nur in deiser hinsicht bekannt und kann sie nicht auf die suche beziehen
if ListBox1.Items.IndexOf(Ed1.Text)=-1 then ListBox1.items.Add(Ed1.Text);
Bitee um Hilfe!!!!