Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StrList zeilenw. kopiern unter Berücksichtg. Schwarzen Liste (https://www.delphipraxis.net/150196-strlist-zeilenw-kopiern-unter-beruecksichtg-schwarzen-liste.html)

Coder 9. Apr 2010 23:21


StrList zeilenw. kopiern unter Berücksichtg. Schwarzen Liste
 
Hallo,

ich weiß nicht mehr weiter.
Seit heute Nachmittag hab ich allesmögliche probiert.
Ich blick schon fast durch meinen eigenen Code nicht mehr.
  • Ich möchte eine Stringliste {Listbox1} zeilenweise in eine andere {Listbox3} kopieren, (!) FALLS je Zeile - in einer Listbox2 festgehaltenen - Zeichenketten NICHT vorkommen.(Schwarze Liste)
  • lediglich wenn ein bestimmter Zeichenkettenstring zutrifft, soll die Zeile in Listbox4 kopiert werden (nicht in Listbox3 !!!)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Erg : String;
  j, k: Integer;
begin
  listbox3.Clear;
  listbox4.Clear;    // EDIT: hier stand gerade eben noch "Listbox2.clear"
  Erg := '';
  for j := 0 to listbox1.items.Count - 1 do
  begin
    for k := 0 to ListBox2.items.Count - 1 do
    begin
      if Pos(ListBox2.Items.Strings[k], listbox1.items.Strings[J]) < 1 then
      begin
        Erg := listbox1.items.Strings[J];
      end;
    end;
    if Erg <> '' then Listbox3.items.Add(listbox1.items.Strings[J]) else
      Memo4.Lines.Add(listbox1.items.Strings[J]);
    Erg := '';
  end;
Den Aspekt, daß falls der bsondere Satz enthalten ist, hab ich noch gar nicht berückschtigt - weil schon der Rest nicht klappt.

Beispielliste Listbox1

* Knieoperation Patient Müller
* Magenspiegelung Dr. Kranich
* Magensonde Patient Röhrig
* Rückenmarksnarkose Patient Liebig
* Reanimation Dr. Schmitt
* Skalpell ausgerutscht Dr. Tattrich

Beispielliste Listbox2
* Knieoperation
* Spiegelung
* Skalpell

Der besondere Satz soll
"Reanimation" lauten und die Zeile {"Reanimation Dr. Schmitt"} in Listbox 4 kopieren, nicht aber in listbox 3

Listbox3 soll dann später enthalten:
* Magensonde Patient Röhrig
* Rückenmarksnarkose Patient Liebig


1) Seht Ihr was ich falsch mache?
2) Habt Ihr eine Idee, wie man die Berücksichtigung des "besonderen Substrings" darin einfädeln kann?

EDIT:
a) Ich habe meinen letzten, annähernd funktionierden Code gepostet.
Die davor wage ich wegen der Unübersichtlichkeit und Unzweckmäßigkeit erst gar nicht.
bei obigem, werden zu 90% richtige Strings aussortiert, doch 10% sind unkorrekter Weise auch mit in Listbox3.
b) Erg wird doch auf '' gesetzt?

Fussball-Robby 9. Apr 2010 23:23

Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L
 
Erstens: Was passiert denn zur Zeit, wenn du den Code ausführst? Zweitens: Warum leerst du Listbox2 vor der Schleife? Dann ist die "Blacklist" doch weg..

[Edit] Außerdem müsstest du Erg beio jedem Durchlauf wieder auf '' setzen, sehe ich das richtig? Sonst ist ja immer das Ergebnis des vorherigen Durchlaufs noch mit drinnen.


[Edit2]Okay, dann zur inneren Schleife. Es darf ja keins der Elemente der Blacklist vorkommen. Wenn nun abewr das erste der Blacklist nicht vorkommt, wird Erg direkt gesetzt. Kommt danach noch ein Wort aus der Blacklist vor, zum Beispiel das zweite, ist Erg immer noch gefüllt und wird somit in Listbox3 geschrieben. Ich hoffe ich habe dieses mal nicht übersehen...


[Edit3]Ich hab das ganze mal bei mir ausprobiert und es mir erlaubt ein bisschen am Code zu werkeln :wink: Anstelle der Erg-Variable nutze ich eine Boolsche Veriable, die beinhaltet, ob der Eintrag "okay" ist oder nicht. Unabhängig davon wird vor der Schleife auf den Sonderstring überprüft (ich hoffe, der Sonderstring darf auch die Inhalte der Blacklist enthalten). Hier der Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  B: Boolean;
  j, k: Integer;
begin
  listbox3.Clear;
  listbox4.Clear;
  for j := 0 to Listbox1.Items.Count - 1 do
  begin
    if Pos('reanimation', LowerCase(listbox1.items.Strings[J])) > 0 then
    begin
      Listbox4.Items.Add(listbox1.items.Strings[J]);
    end
    else
    begin
      B := True;
      for k := 0 to ListBox2.Items.Count - 1 do
      begin
        if Pos(LowerCase(ListBox2.Items[k]), LowerCase(Listbox1.Items[J])) > 0 then
        begin
          B := False;
        end;
      end;
      if B then
      begin
        Listbox3.items.Add(listbox1.items.Strings[J]);
      end;
    end;
  end;2
end;
Ich hoffe, das hilft. Bei mir ergab es die richtigen Ergebnisse. Abgesehen von dem Ausbessern des Logikfehlers (aus [Edit2]) habe ich auch die Groß- und Kleinschreibung durch das LowerCase ignoriert.

Gruß

himitsu 10. Apr 2010 08:55

Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L
 
Ich denke ListBox4 und nicht Memo4 ... was macht also das Memo4 in deinem Code?

Wozu der String "Erg", wenn du ihn eh nur wie einen Boolean verwendest, in einer IF-Abfrage?

Deine Abfrage "If Pos(..." sollte besser andersrum sein, denn du willst ja wissen ob mindestens einer der Strings enthalten ist.

"Pos > 0" = mindestens Einer enthalten, da bei ersten auffinden reagiert wird
"Pos < 1" aka "Pos = 0" = alle enthalten enthalten, da beim ersten nichtauffinden reagiert wird


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  j, k: Integer;
  b: Boolean;
begin
  ListBox3.Clear;
  ListBox4.Clear;
  for j := 0 to ListBox1.Items.Count - 1 do
  begin
    b := False;
    for k := 0 to ListBox2.Items.Count - 1 do
      if Pos(ListBox2.Items.Strings[k], ListBox1.Items.Strings[j]) > 0 then
        b := True;
    if b then ListBox3.Items.Add(ListBox1.Items.Strings[j])
      else ListBox2.Items.Add(ListBox1.Items.Strings[j]);
  end;
noch ein bissl optimiert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  j, k: Integer;
  b: Boolean;
  s: String;
begin
  ListBox3.Clear;
  ListBox4.Clear;
  for j := 0 to ListBox1.Items.Count - 1 do
  begin
    s := ListBox1.Items.Strings[j];
    b := False;
    for k := 0 to ListBox2.Items.Count - 1 do
      if Pos(ListBox2.Items.Strings[k], s) > 0 then
      begin
        b := True;
        Break; // wozu weitersuchen, wenn schon gefunden
      end;
    if b then ListBox3.Items.Add(s) else ListBox2.Items.Add(s);
  end;
PS: Müssen eigentlich die Strings aus LisbBox2 genau enthalten sein, also beide Stings übereinstimmem,
oder können sie auch nur ein Teil des eines Strings aus der ListBox1 sein?

PSS: Wie ist es mit Groß-/Kleinschreibung?

sx2008 10. Apr 2010 16:19

Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L
 
Zitat:

Zitat von Coder
Ich blick schon fast durch meinen eigenen Code nicht mehr.

Weil du das Problem falsch angehst. Reduziere so viel wie möglich.
Dann bleibt noch übrig:
1.) die Quell-Liste
2.) die Blacklist
3.) die Ergebnisliste
Daraus wird dann diese Prozedur:
Delphi-Quellcode:
procedure CopyList(srclist{Quell-Liste}, dstlist{Ergebnisliste}, blacklist:TStrings);
var
  s : string;
  i : integer;
begin
  dstlist.clear; // Ergebnisliste löschen
  for i:=0 to srclist.count-1 do
  begin
    s := srclist[i];
    if not IsBlacklisted(blacklist, s) then
      dstlist.Add(s);
  end;
end;
Dieser Code ist leicht verständlich und kaum noch zu vereinfachen.
Die Funktion IsBlacklisted() prüft, ob irgendein String aus der Blacklist im String s enthalten ist.
Ich denke das kriegst du jetzt selber hin.

himitsu 11. Apr 2010 08:17

Re: StrList zeilenw. kopiern unter Berücksichtg. Schwarzen L
 
Zitat:

Zitat von sx2008
Ich denke das kriegst du jetzt selber hin.

IsBlacklisted würde einfach nur der inneren Schleife "k" entsprechen, also der Variante mit dem Boolean.

[ot] Gut, ich verstehe diese Funktion noch und erkenn recht schnell was sie macht, aber das macht wohl auch die jahrelange "Erfahrung" der Programmierung und vorallem unmassen fremder Codes, hier in der DP, zu lesen. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz