Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mengentypen (set?) zur Laufzeit füttern (https://www.delphipraxis.net/142905-mengentypen-set-zur-laufzeit-fuettern.html)

messie 5. Nov 2009 19:40


Mengentypen (set?) zur Laufzeit füttern
 
Moin,

die Mengentypen mögen mich nicht oder ich sie nicht :?
Ich habe eine Ansammlung von integers, die ich mit geringem Aufwand parsen möchte.
Also etwa mit
Delphi-Quellcode:
if check in [1,28,34,99] then
begin
  //Code
end;
Die Menge der Zahlen in der Klammer ist so groß, dass sie irgendwo anders deklariert werden muss.
Der Vergleich kann auch als string stattfinden, weil ich die Fehlercodes so geliefert bekomme.
Noch schöner wäre es, wenn ich einen Mengentyp zur Laufzeit aus einer ini füttern könnte.

Was ist da der sinnvollste Ansatz?

Den Weg über eine array-Prüfung könnte ich natürlich gehen, aber den Umgang mit den Mengentypen würde ich da gerne ausloten. Ich gehe mal davon aus, dass die Performance da höher ist (sind schon einige Daten zu prüfen).

Ach ja, man braucht ja jetzt manchmal den Disclaimer: bitte nur ernstgemeinte Zuschriften unter ...
:wink:

Grüße, Messie

Namenloser 5. Nov 2009 19:59

Re: Mengentypen (set?) zur Laufzeit füttern
 
Die Sets werden unter Delphi soweit ich weiß mit Bitmasken realisiert. Wenn du das für größere Werte nachbauen willst, könntest du dir die Klasse TBits anschauen. Aber bedenke, dass die Daten in dieser Form, sehr, sehr groß werden. Ein Integer hat 32Bit, das heißt er kann Werte von 0 bis 4 294 967 295 darstellen. Für jeden dieser Werte brauchst du bei der Bitmaske ein Bit, somit wäre die Bitmaske für einen 32Bit-Integer nach meiner Rechnung über 500MB groß! Ich weiß nicht, ob du das wirklich willst...

messie 5. Nov 2009 20:44

Re: Mengentypen (set?) zur Laufzeit füttern
 
Wenn ich das richtig verstanden habe, sind die Mengentypen nur dann sinnvoll und auch schneller, wenn ein einzelnes Element nicht größer als ein Byte (oder Word?) ist. Das würde zu den Beispielen passen, die in der OH stehen.
Was mich etwas irritert, ist, dass der Compiler Ordinaltypen verlangt. Und die dürfen ja schon größer als ein Word sein, akzeptieren aber laut OH keine In64-Typen ( ord() ).

Hmm, so richtig schlüssig ist das für mich noch nicht. Vielleicht fehlt in der OH dort die Angabe der Grenzen.
Dann nehme ich wohl doch erstmal das array.

Grüße, Messie

Neutral General 5. Nov 2009 21:03

Re: Mengentypen (set?) zur Laufzeit füttern
 
Ordinale Typen sind eigentlich 1 Byte große Typen wie Byte oder Char. (Nein, dass ist nicht die korrekte Definition - ich weiß..)

Word/Cardinal/Integer/Int64 etc sind keine Ordinalen Typen. Genau wie Strings.

Wieso nimmst du kein Array?

messie 5. Nov 2009 21:18

Re: Mengentypen (set?) zur Laufzeit füttern
 
Zitat:

Zitat von Neutral General
Wieso nimmst du kein Array?

Ich nehme jetzt schon ein array. :)
Ich hatte in Richtung Performance gedacht, deshalb die Frage nach Mengentypen.
Die zu analysierende Datenmenge wird halt recht groß...

Grüße, Messie

Neutral General 5. Nov 2009 21:21

Re: Mengentypen (set?) zur Laufzeit füttern
 
Ich glaube Mengen wären in dem Fall nur im Code praktischer und leichter zu handhaben. Performanter wären die glaube ich nicht.

Medium 5. Nov 2009 21:40

Re: Mengentypen (set?) zur Laufzeit füttern
 
Ordinal heisst lediglich "geordnet abzählbar", d.h. die Werte haben einen Rang, einen definierten und gleichmäßigen Abstand, und man kann sie nacheinander "aufsagen". Folglich sind soweit alle Ganzzahltypen in Delphi ordinal. Mal nur so am rande, weil's mir auffiel ;)

mirage228 5. Nov 2009 21:56

Re: Mengentypen (set?) zur Laufzeit füttern
 
Bis 256 gehts sehr schnell mit Sets. Ansonsten könntest Du es mit einer Hashliste (siehe: Hier im Forum suchencsDictionary) probieren.

Viele Grüße

Neutral General 5. Nov 2009 22:05

Re: Mengentypen (set?) zur Laufzeit füttern
 
Zitat:

Zitat von Medium
Ordinal heisst lediglich "geordnet abzählbar", d.h. die Werte haben einen Rang, einen definierten und gleichmäßigen Abstand, und man kann sie nacheinander "aufsagen". Folglich sind soweit alle Ganzzahltypen in Delphi ordinal. Mal nur so am rande, weil's mir auffiel ;)

Ach ja.. Was ich meinte war, dass Sets nur mit 1-Byte Datentypen gehen..

Khabarakh 5. Nov 2009 23:24

Re: Mengentypen (set?) zur Laufzeit füttern
 
Zitat:

Zitat von Neutral General
Performanter wären die glaube ich nicht.

Öhm, doch :gruebel: . O(1) vs. O(n), um ein Element zu finden, kann schon einen großen Unterschied machen. Die von mirage228 erwähnte Hashliste schafft im Normalfall ebenfalls O(1).


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:51 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