Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TStringList nach Dupplikaten suchen - Standard Pascal (https://www.delphipraxis.net/215755-tstringlist-nach-dupplikaten-suchen-standard-pascal.html)

paule32.jk 2. Sep 2024 12:04

TStringList nach Dupplikaten suchen - Standard Pascal
 
Hallo,
ich habe gerade eine kleine Blockade, um vorhandene items in einer TStringList zu finden.
wenn gefunden, dann soll found := true; ansonsten false; einnehmen.

die Suchfunktion unten iteriert von 0 auf Count-1 - aber was ist, wenn weitere Einträge vorhanden sind ?

Delphi-Quellcode:
function TCustomMetaName.get(index: Integer): String;
var found: Boolean;
var index: Integer;
begin
    // index out of bounds ?
    if (index > MetaList.Count-1)
    or (index < 0)
    or ((MetaList.Count-1) < 0) then
    begin
        if debugMode then
        begin
            ShowMessage(
            Locale.tr('Error: meta name is empty/out of bounds.') + #13#10 +
            Locale.tr('A Exception should stop the build.'));
            raise Exception.Create(Locale.tr('internal error'));
        end;
        raise Exception.Create(Locale.tr('internal error'));
    end;
   
    // duplicates in list ?
    found := false;
    for index := 0 to MetaList.Count - 1 do
    begin
        if MetaList[index].Values['name'] = ...  <--- hier
    end;
end;

Papaschlumpf73 2. Sep 2024 12:17

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
Ist MetaList sortiert?

jaenicke 2. Sep 2024 12:21

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
Also erstens ist es keine gute Idee, dass deine lokale Variable genauso heißt wie der Parameter. Deshalb setzt man Parametern üblicherweise ein A voran, z.B. AIndex.

Du möchstest herausfinden, ob der per Index angegebene Eintrag noch einmal in der Liste vorkommt? Und was soll dann passieren? (Denn zurück wird ja ein String geliefert...)

Und deine Liste enthält Werte in der Form und du möchtest den rechten Teil nach dem Gleichheitszeichen suchen? (Weil du auf Values zugreifst)
Zitat:

A=Wert1
B=Wert2
Test=Wert3

paule32.jk 2. Sep 2024 12:39

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
ja, die .Value Einträge.

Die Liste:
name=123
name=abc
name=zupf
content=quatschpillepalle

"name" kommt mehrmals vor (als key: name) ... aber die Value's sind anders.

wenn Dupplikat gefunden wurde, soll der Suchvorgang abbrechen,
und eine ShowMessage anzeigen.

Papaschlumpf73 2. Sep 2024 12:44

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
Das hier wäre dann auch ein Duplikat?

name=123
content=123

himitsu 2. Sep 2024 13:30

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
Zitat:

Zitat von jaenicke (Beitrag 1540453)
Also erstens ist es keine gute Idee, dass deine lokale Variable genauso heißt wie der Parameter. Deshalb setzt man Parametern üblicherweise ein A voran, z.B. AIndex.

Keine Sorge, eine ordentliche Programmiersprache erlaubt sowas eh nicht. :angle:

Zitat:

Zitat von Zeile 25 = das VAR
[dcc32 Fehler] Unit27.pas(25): E2004 Bezeichner redeklariert: "index"
[dcc32 Fataler Fehler] Project27.dpr(5): F2063 Verwendete Unit 'Unit27.pas' kann nicht compiliert werden




Zitat:

Delphi-Quellcode:
 if MetaList[index].Values['name'] = ... <--- hier

Values oder Strings?

Delphi-Quellcode:
MetaList[index]{.Values['name']}

entspricht
Delphi-Quellcode:
MetaList.Strings[index]{.Values['name']}

aber du meinst bestimmt
Delphi-Quellcode:
MetaList.ValueFromIndex[index]

Rollo62 2. Sep 2024 14:27

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
http://www.delphibasics.co.uk/RTL.php?Name=TStringlist

Vieleicht suchst Du sowas wie ValueFromIndex?
Delphi-Quellcode:
for i := 0 to names.Count-1 do
  begin
    ShowMessage(names.Names[i]+' is '+names.ValueFromIndex[i]);
  end;

paule32.jk 2. Sep 2024 14:40

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
ValueFromIndex kommt schon sehr nah dran, danke.

himitsu 2. Sep 2024 16:40

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
Mir war so, als gab es auch ein Array (oder notfalls Enumerator) für die Values alleine, aber nee,
nur Namen bzw. Keys, sowie Strings (also 'Name=Value'), sonst würde auch sowas gehn:

Delphi-Quellcode:
if MatchStr('abc', MetaList.ToValues) then // oder MatchText() für case-insensitive
  ValueInListeGefunden;

Blup 3. Sep 2024 15:12

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
Erst MetaList (oder eine Kopie davon) mit eigener Vergleichsfunktion nach ValueFromIndex sortieren.
In der sortierten Liste stehen danach gleiche Values hintereinander.
Einfach Schritt für Schritt durchgehen und mit dem jeweiligen Vorgänger vergleichen.

himitsu 3. Sep 2024 15:56

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
Leider fehlen viele Funktionen für Values.

Dass es nur ein Values[Name] und kein Values[Index] gibt (ja, das doppelt gemoppelte ValuesFromIndex[Index] ignoriere ich mal), liegt lag am Delphi 1-7, da sich dort Default-IndexProperty nicht überladen ließen, aber das geht nun seit vielen Jahren,
dann fehlt ein IndexOfValue (IndexOf, IndexOfName und IndexOfObject gibt es ja auch),
dann noch die fehlenden ToNameArray und ToValueArray (zu den ToStringArray und ToObjectArray)
sowie Duplicates für Names und Values

und schon hätten wir viele Fälle abgedeckt, welche hier und die letzten Monate über immer mal welche hatten.



Und warum wir Duplicates=dupError ignoriert, wenn Sorted=False?
Wenn es beim Zuweisen ignoriert wird, sollte es beim Zuweisen bereits einen Fehler gegen,
außerdem gibt es keinen Grund, dass es nicht funktioniert ... nur weil jemand bei Borland/Emba zu faul war das für den unsortieren Fall zu implementieren, abgesehn davon dass IndexOf sowohl sortiert als auch unsortiert funktioniert.

Sinspin 3. Sep 2024 17:26

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
Ich versuche in letzter Zeit auf die Stringliste zu verzichten wenn ich Wertepaare habe.
Mit einer Memtable kann man sowas deutlich angenehmer lößen.

Rollo62 4. Sep 2024 06:44

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
Zitat:

Zitat von Sinspin (Beitrag 1540495)
Mit einer Memtable kann man sowas deutlich angenehmer lößen.

Interessante Idee.
Wieviel Overhead bringt das denn im Gegensatz zu TStringList und Generics.TDictionary, hast Du das mal gegenübergestellt?

Ich hätte für Key/Value jetzt eigentlich ein TDictionary genommen, aber ja,
TMemTable hätte noch ein paar sehr hübsche Nebeneffekte (Load/Save/Mehrfachvalues/Dataset-Kompatibel/...).

Sinspin 4. Sep 2024 08:28

AW: TStringList nach Dupplikaten suchen - Standard Pascal
 
Wir verwenden seit Jahren die KBMMemTable in der Firma. Komplett Pascal, irre schnell und extrem flexibel.
Alle paar Jahre hohle ich mir auch privat eine neue Pro Version.

Schon alleine das es TDataSet compatibel ist und echte Feldtypen hat, ist es tausendmal besser als TStringList.
Mit Generics gingen einfache Sachen ja auch. Aber filtern, sortieren, suchen, ... ist alles ein Kinderspiel mit der MemTable.
Ich verwende die sogar zum übertragen von Daten übers Netz oder über IPC Kommunikation. Irgendwie muss man seine Daten ja in ein ordentliches Format bekommen.

Overhead, gute Frage. Habe ich mich nicht wirklich mit befasst.
Andere Lösungen sind meißt umständlicher zu bedienen. Was anderes interessiert mich nicht.
Schneller als TStringList ist es sowieso.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 Uhr.

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