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;    // Beliebiger Buchstabe (in M enthalten)
    MB: Menge;         // Menge aller für diesen Fall gültigen Buchstaben


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!