Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Mengenoperationen
horsti - So 19.02.06 13:20
Titel: Mengenoperationen
Hi,
ich habe eine Variable x, die ein Element vom Mengentyp XY besitzt.
Nun möchte ich gerne möglichst effizient prüfen, ob ein größeres Element in der Menge existiert und dieses, wenn vorhanden, auch zuweisen.
Wie mache ich das, möglichst elegant?
Danke
Gruß
Henning
BenBE - So 19.02.06 13:24
Was meinst Du genau? Kannst Du das bitte etwas ausführlicher beschreiben?
Wie ist Menge XY aufgebaut?
Meinst Du sowas hier?
Delphi-Quelltext
1: 2: 3: 4:
| type XY = set of (a,b,c,d,e,f,g,h,i,j); var X: XY;
If a in X Then X := X + [b,c,d,e,f,g,h,i,j); |
???
Oder was meinst Du?
horsti - So 19.02.06 13:34
Oh, ja klar.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| type buchstaben = (a,b,c,d,e,f,g,h,i,j) menge = set of buchstaben; var z : menge; x : buchstaben;
If x < high(z) then x := nächst größeres Element; |
Also, ich möchte wissen, ob x bereits das höchste Element in der Menge ist (j), wenn nicht, soll es den Wert des nächst größeren Elementes annehmen.
Beispiel: x ist j - fertig
x ist b -> x ist c
x ist d -> x ist e
Wie mache ich das?
BenBE - So 19.02.06 14:03
Gibt's viele Möglichkeiten:
Eine einfache mit Hilfe einer Schleife (und Elementen in der Menge):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| For X := i downto a do Begin If X in Z Then begin Z := Menge(2 shl Ord(X)); Break; end; end; |
Wenn Menge
[a,b,c] enthielt, enthält sie nach der Schleife
[d].
Die weitere Version, für einfache Enums geht sogar noch einfacher:
Delphi-Quelltext
1: 2:
| If x < High(Buchstaben) Then x := Succ(X); |
horsti - So 19.02.06 14:22
Joar, an Schleife hab ich auch gedacht, aber ich hätte gedacht, dass es irgendwie einfach geht.
Wie kann ich in meiner Menge das größte Element ermitterln? Also quasi high für Mengen, gibts sowas?
BenBE - So 19.02.06 14:39
Für Mengen (Sets) nimmst Du den ersten Quelltext, für Aufzählungen (Enums) den zweiten Source aus meinem vorigen Posting.
horsti - So 19.02.06 17:03
Leider kann ich das nicht.
Ich habe nämlich festgestellt das noch eine schwierigkeit hinzukommt.
Und deine Schleife mir auch sonst nicht das gewünschte Ergebnis bringt.
Also x ein ist Element der Menge XY, XY ist aber nicht immer die selbe Menge!!
XY kann einmal die Werte: [a..c] haben oder auch nur [a] oder [d..g] alles ist möglich!
aber x ist auf jeden Fall ein Element der Menge, nun muss ich noch herausfinden, ob x das größte Element ist, was ich ja ZUR NOT auch mit einer Schleife machen kann und wenn es NICHT das größte Element ist, dann soll x ein Element aufsteigen, also den NÄCHST größeren Wert annehmen. XY bleibt dabei unverändert.
BenBE - Mo 20.02.06 14:47
Also Du meinst sowas hier:
Delphi-Quelltext
1: 2: 3:
| var BS: Buchstaben; MB: Menge; |
Wobei wir annehmen, folgendes Beispiel zu haben:
Delphi-Quelltext
1: 2:
| BS := b; MB := [b, d, g, i]; |
Und du willst nun, dass
BS = d herauskommt?
Das würde man dann so machen können:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var Tmp : Buchstaben; begin for Tmp := BS to High(BS) do Begin If (Tmp in MB) AND (Tmp <> BS) Then Begin BS := Tmp; Break; end; end; end; |
horsti - Mo 20.02.06 15:04
Alles klar, danke dir!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!