Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - array problem - in oder is zum vergleichen ?


mimi - Do 08.01.04 16:42
Titel: array problem - in oder is zum vergleichen ?
Hallo,
ich möchte schauen ob in einem arrry bestimmte werte drinen stehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  test:array[0..9of integer;
begin
  for i:=0 to 50 do begin
    if i in test then .... // aber das geht leider nicht, wie geht das ???
  end;
end;

ich möchte nicht eine zweite procedure schreiben die das nachschaut.
ich habe mal was von in und is gehört....


Nightmare_82 - Do 08.01.04 16:46

in ist für sets und nicht für Arrays.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
type
TColor = (clBlack, clRed, clGreen);
VAR
Color : set of TColor;

begin
  if clBlack in Color then
  begin
  end;
end;

//is ist zur Abfrage, von welcher Klasse ein Objekt ist:
if AOwner is TForm then
begin
end;


mimi - Do 08.01.04 16:57

schade, ich dachte damit könnte ich es vereinfachen.... aber anscheiend leider nicht.
so bleib mir wohl nichts andres übrig als eine proc zu schreiben die das tut.


Nightmare_82 - Do 08.01.04 17:01

je nachdem, was du machen willst geht es mit sets.
In sets kommt jede Zahl halt nur höchstends einmal vor(es ist ja eine Menge, keine Liste). Wenn das bei dir auch so ist, kannst du es mit sets machen.
Guck einfach mal in der Hilfe.


mimi - Fr 09.01.04 15:23

ja es bringt ja wengine 10 mal die gleiche datei löschen zu wollen.
ok dann mache ich es mal mit set könntes du/ihr mir mal ein kleines beispiel geben ?


Nightmare_82 - Fr 09.01.04 16:09

mimi hat folgendes geschrieben:
ja es bringt ja wengine 10 mal die gleiche datei löschen zu wollen.
ok dann mache ich es mal mit set könntes du/ihr mir mal ein kleines beispiel geben ?

Du hast ja nix von dateien gesagt :wink:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
TMyFiles = 1..99// Indexe für deine Dateien
var
Files1 : TMyFiles;
Files2 : TMyFiles;

begin
Files:= [5,3]; // Dateien 5 und 3 sind in der Menge
if [3in Files then // Abfrage, ob 3 in Menge ist
Files:= Files + [7]; // 7 hinzufügen
Files:= Files - [7,3]; // 7 und 3 wegnehmen

ich habe lange nicht mit sets gearbeitet, deswegen bin ich mir bei der Syntax nicht sicher(habe hier kein Delphi) aber so in der Art sollte es gehen.


Wolff68 - Fr 09.01.04 18:29

Sets haben eben das Problem, daß es nicht so einfach ist zur Laufzeit Elemente dazu- oder wegzunehmen. (Hab aber mit Sets auch noch nicht so viel gearbeitet)

Denke für Dein vorhaben wäre eine TStringList sehr gut geeignet.
Da gibt es ein IndexOf() Das gibt Dir die Position des Strings innerhalb der Liste oder -1 zurück. (Funktioniert fast wie Pos().
Ausserdem gibt es Funktionen zum sortieren sowie um doppelte Einträge zu verhindern.

!! Ich mein TStringLIST; nicht TStrings !!


mimi - Fr 09.01.04 19:18

TStringlisten für zahlen ?
ich habe nur eine Liste die aus Zahlen bestht deshabl nehme ich einen dynamischen Array und fertig. ich dachte das man da einfach per in bzw. is nach schauen könnte ob da ein bestimmter wert drinen steht oder nicht. aber das geht ja nicht deshalb habe ich mir eine Funktion geschrieben die das kann und fertig. Aber danke für eure Mühen


Wolff68 - Fr 09.01.04 19:53

Ups. Stimmt ja. Du hast ja Zahlen im Array...
War irgendwie gedanklich bei den Dateinamen hängen geblieben.

Nichtsdestotrotz geht es natürlich auch mit Zahlen, die als String in der TStringList abgelegt sind... 8)
(OK. Eine kleine Funktion die das Array durchläuft reicht ja dann vollkommen aus)


mimi - Fr 09.01.04 20:39

es gibt viele möglichkeiten wie man zahlen als listen abspeichen kann:
arrays
TStringListen
String
.....
:D


Nightmare_82 - Sa 10.01.04 20:06

Wolff68 hat folgendes geschrieben:
Sets haben eben das Problem, daß es nicht so einfach ist zur Laufzeit Elemente dazu- oder wegzunehmen. (Hab aber mit Sets auch noch nicht so viel gearbeitet)

hast du meinen Code gelesen? Was ist daran nicht einfach?
Und der Vorteil von sets ist, sie vebrauchen wenig Speicher, der Vergleich geht sauschnell, ebenso wie das Hinzufügen und Wegnehmen von Elementen, da es alles nur Bitoperationen wie or und and sind.

Eine String-List ist so zeimlich das langsamste, was du für dieses Problem nehmen kannst.
@mimi : Wieso willst du keine sets nehmen? Die können doch alles was du brauchst?!


Michael Stenzel - Sa 10.01.04 20:38

Und warum nicht mit zwei FOR - Schleifen lösen? :wink:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var 
  test:array[0..9of integer; 
  x : integer;
begin 
  for i:=0 to 50 do
     for x := 0 to 9 begin 
         if i = Test[x]  then .... //  Funktion ausführen
     end
end;


Ups, Du hast es ja schon gelöst. ist mir ganz entgangen. :oops:
Michael.