Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zwei Listen filtern Denkproblem (https://www.delphipraxis.net/200808-zwei-listen-filtern-denkproblem.html)

DeddyH 28. Mai 2019 12:17

AW: Zwei Listen filtern Denkproblem
 
Delphi-Quellcode:
 for j := Staedte2.Count - 1 downto 0 do
   begin
    Stadt1 := Staedte2.Strings[j].Split([','])[0];
    Stadt2 := Staedte2.Strings[j].Split([','])[1];
    if (Staedte1.IndexOf(Stadt1) < 0) or (Staedte1.IndexOf(Stadt2) < 0) then
      Staedte2.Delete(j);
   end;
Ungetestet und auch nicht wirklich performant, müsste aber tun.

DieDolly 28. Mai 2019 12:23

AW: Zwei Listen filtern Denkproblem
 
Eine kurze Lösung und die verstehe ich zum Glück auch. Ich führe das nur ein mal aus. Es dauert zwar eine ganze Sekunde aber ich glaube das ist verkraftbar.
Schneller wär immer schön aber damit bin ich erst einmal zufrieden.

Wäre es schneller die StringList durch eine TObjectList mit Klasseninstanzen zu ersetzen wo jede Klasse nur ein FCity: string hat?
Die THashedStringList ist zwar schon etwas schneller aber auch nicht viel.

Moombas 28. Mai 2019 12:42

AW: Zwei Listen filtern Denkproblem
 
Wieso nicht ungefähr so:

Delphi-Quellcode:
//Erst der Befehl zum lesen der einzelnen Städte
//dann folgende if abfrage
if Stadte1.indexof('zu suchender Stadtname') = -1 then
begin
  //Hier der Code zum löschen der Stadte in der Staedte2 StL
end;
XD zu lange noch nebenbei was anderes gemacht^^ DeddyH war daher schneller und hat dei komplette Lösung^^

DieDolly 28. Mai 2019 13:01

AW: Zwei Listen filtern Denkproblem
 
Ich hatte auch einen zweiten Denkfehler drin. ich hatte um das IndexOf noch eine schleife die durch die StringList geht. Deswegen dauerte das auch 1 Sekunde.

Uwe Raabe 28. Mai 2019 13:02

AW: Zwei Listen filtern Denkproblem
 
Zitat:

Zitat von DieDolly (Beitrag 1433260)
Wäre es schneller die StringList durch eine TObjectList mit Klasseninstanzen zu ersetzen wo jede Klasse nur ein FCity: string hat?

Nein, das wäre vermutlich nicht schneller. Die Staedte1 sortieren könnte vielleicht was bringen. Auch der doppelte Split-Aufruf könnte in einer lokalen Variable gecached werden.
Delphi-Quellcode:
var
  dummy: Integer;
  tempArr: TArray<string>;
...
    Staedte1.Sorted := True;
    for j := Staedte2.Count - 1 downto 0 do
    begin
      tempArr := Staedte2[j].Split([',']);
      Stadt1 := tempArr[0];
      Stadt2 := tempArr[1];
      if not Staedte1.Find(Stadt1, dummy) or not Staedte1.Find(Stadt2) then
        Staedte2.Delete(j);
    end;
Wenn man auf das Split verzichten will, kann man das alternativ auch mit dem NameValueSeparator erreichen:
Delphi-Quellcode:
    Staedte1.Sorted := True;
    Staedte2.NameValueSeparator := ',';
    for j := Staedte2.Count - 1 downto 0 do
    begin
      Stadt1 := Staedte2.Names[j];
      Stadt2 := Staedte2.ValueFromIndex[j];
      if not Staedte1.Find(Stadt1, dummy) or not Staedte1.Find(Stadt2, dummy) then
        Staedte2.Delete(j);
    end;

Luckie 28. Mai 2019 13:04

AW: Zwei Listen filtern Denkproblem
 
Zitat:

Zitat von DieDolly (Beitrag 1433258)
Eine dritte Liste kann ich leider nicht anlegen.

du wirst doch im Code eine temporäre dritte Liste anlegen können? Du kannst ja anscheinen auch Variablen anlegen. :roll:

freimatz 28. Mai 2019 15:08

AW: Zwei Listen filtern Denkproblem
 
Zitat:

Zitat von DieDolly (Beitrag 1433256)
Danke für die Hilfe aber das hilft mir alle nicht weiter. Das ist wie mit Kanonen auf Spatzen schießen.

Ey warum denn? Soll nicht der Spatz tot sein? Wenn das mit einer Kanone geht und du die hast, warum nicht. Und im Gegensatz zur Kanone gibt es bei der Lösung von Schokohase keinen Kollateralschaden.

DieDolly 28. Mai 2019 17:06

AW: Zwei Listen filtern Denkproblem
 
Eine Andere Idee hatte ich eben. Ich habe der Klasse der zweiten Liste ein Property verpasst was auf True gesetzt wird, wenn der Eintrag ignoriert werden soll.
Damit fällt das Löschen schon einmal weg. Ansonsten nutze ich jetzt die HashedStringList aus TIniFiles. Das dauert jetzt alles keinen Wimpernschlag mehr.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.
Seite 2 von 2     12   

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