Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variable mit mehreren Werten vergleichen ohne "OR" ? (https://www.delphipraxis.net/81480-variable-mit-mehreren-werten-vergleichen-ohne.html)

Karstadt 28. Nov 2006 07:21


Variable mit mehreren Werten vergleichen ohne "OR"
 
Guten morgen.

Delphi-Quellcode:
Procedure Gegenstand(Bezeichnung:String);
begin
...
  IF (Bezeichnung= 'rohr') or (Bezeichnung= 'schraube') or (Bezeichnung= 'schraubendreher') Then ....
...
end;
kann man das einfacher machen das ich einfach auf OR verzichente kann ? MFG

RavenIV 28. Nov 2006 07:34

Re: Variable mit mehreren Werten vergleichen ohne "OR&a
 
ich sehe da keine andere "schöne" Lösung.

Dies hier geht nicht, weil String keine ordinaler Typ ist:
Delphi-Quellcode:
if x in ['aaa', 'bbb', 'ccc'] then
begin
  ...
end;
was Du noch machen kannst: mehrere if verschachteln
Delphi-Quellcode:
if x = 'aaa' then
begin
  if x = 'bbb' then
  begin
    if x = 'ccc' then
    begin
      ...
    end;
  end;
end;
was besseres fällt mir nicht dazu ein.

Karstadt 28. Nov 2006 07:36

Re: Variable mit mehreren Werten vergleichen ohne "OR&a
 
Dann ist ja die erste Lösung (meine) schöner ;)

Denn wenn es um 10 vergleichweten kommen soll, dann werden das 10x or´s :(

SirThornberry 28. Nov 2006 07:37

Re: Variable mit mehreren Werten vergleichen ohne "OR&a
 
Das verschachteln wäre nicht der Nachbei mit "or" sonder das was der compiler intern bei "and" macht.

volkerw 28. Nov 2006 08:30

Re: Variable mit mehreren Werten vergleichen ohne "OR&a
 
Hallo,
bei 10 Vergleichswerten ist folgende Lösung wahrscheinlich übersichtlicher und flexibler:
Delphi-Quellcode:
Procedure Gegenstand(Bezeichnung:String);
var
  sl : TStringList;
begin
  sl := TStringList.Create;
  sl.CaseSensitive := true;
  sl.DelimitedText := 'rohr, schraube, schraubendreher';
  IF sl.IndexOf(Bezeichnung) > -1 then
    ShowMessage(Bezeichnung + ' ist enthalten.');
  sl.Free;
end;
Gruß, Volker

negaH 28. Nov 2006 08:48

Re: Variable mit mehreren Werten vergleichen ohne "OR&a
 
also bevor du mit der langsammen TStringList arbeitest dann besser so:

Delphi-Quellcode:
if Pos('-' + Bezeichnung + '-', '-rohr-schraube-schraubendreher-') > 0 then
Ist auch nicht sonderlich effizient, da Pos() benutzt wird, drüfte aber schneller sein als eine Schleife, TStringList oä.
Falls Pos() intern nach dem Boyer-Moore Algo. arbeitet ist die Stringsuche sogar sehr effizient.

Die schnellste Lösung dürfte ein Tree sein. In einem solchen Baum sind deine Suchwörter auf spezielle Weise gespeichert so das man darin sehr sehr schnell überprüfen kann ob ein gesuchtes Wort existiert. Je nach Baum-Typus und Codierung würde dieser sogar weniger Speicherplatz verwenden als die Strings wie in deinem Beispiel zu speichern. ZB. Schraube und Schraubedreher würde nur einmal Schraube und einmal "dreher" im Tree speichern. Eine sehr effiziente Tree Struktur im Source kannst du hier saugen: http://www.michael-puff.de/Developer...agen_Reddmann/ Datei DWAG.zip

Das ist ein DAWG und so könntest du ihn benutzen:
Delphi-Quellcode:
var
  List: TDawg = nil;

procedure InitList;
begin
  List := TDawg.Create;
  List.Insert('Schraube'#0'Schraubendreher'#0'Rohr');
  List.Pack;
end;

procedure Search;
begin
  if List.Exists(Suchstring) then
end;
Gruß Hagen

uwewo 28. Nov 2006 08:57

Re: Variable mit mehreren Werten vergleichen ohne "OR&a
 
Wie wäre es wenn Du die einzelnen Worte an ein Array übergibst, und dann per Schleife prüfst ob es existiert.

RavenIV 28. Nov 2006 08:59

Re: Variable mit mehreren Werten vergleichen ohne "OR&a
 
Zitat:

Zitat von uwewo
Wie wäre es wenn Du die einzelnen Worte an ein Array übergibst, und dann per Schleife prüfst ob es existiert.

das ist nicht besser als die Stringlist, aber dafür vermutlich noch langsamer.

MaBuSE 28. Nov 2006 09:02

Re: Variable mit mehreren Werten vergleichen ohne "OR&q
 
Hi,
das hier sieht warscheinlich ein bischen blöd aus, funktioniert aber ;-)

Delphi-Quellcode:
Procedure Gegenstand(Bezeichnung:String);
begin
...
  // statt '#' kann natürlich auch alles andere genommen werden ;-)
  if pos('#'+Bezeichnung+'#', '#rohr#schraube#schraubendreher#')>0 then ....
...
  // oder auch:                 1    6        15 
  case pos('#'+Bezeichnung+'#', '#rohr#schraube#schraubendreher#') of
     1: machwas; // rohr
     6: machwas; // schraube
    15: machwas; // schraubendreher
  else
    machwas; // nix
  end;
...
end;
Das folgende ist etwas eleganter ;-)

Delphi-Quellcode:
function getArrayIndex(s: string; a: array of string): integer;
var
  i: Integer;
begin
  Result := -1;
  for i := low(a) to high(a) do
  begin
    if s = a[i] then
    begin
      Result := i;
      exit;
    end;
  end;
end;

procedure TestIt(Bezeichnung:String);;
begin
...
  if getArrayIndex(Bezeichnung, ['rohr', 'schraube', 'schraubendreher']) > -1 then
...
  case getArrayIndex(Bezeichnung, ['rohr', 'schraube', 'schraubendreher']) of
     0: machwas; // 1. String (rohr)
     1: machwas; // 2. String (schraube)
     2: machwas; // 3. String (schraubendreher)
    -1: machwas; // nicht gefunden
  end;
...
end;
mfg
MaBuSE

MaBuSE 28. Nov 2006 09:04

Re: Variable mit mehreren Werten vergleichen ohne "OR&a
 
Zitat:

Zitat von negaH
also bevor du mit der langsammen TStringList arbeitest dann besser so:

Delphi-Quellcode:
if Pos('-' + Bezeichnung + '-', '-rohr-schraube-schraubendreher-') > 0 then
...
Gruß Hagen

Mist, Hagen war schneller ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:58 Uhr.
Seite 1 von 3  1 23      

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