Autor Beitrag
redbird
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Win XP, Vista Business (64bit), Win 7 Prof. (64bit)
Delphi 7, Java, PHP
BeitragVerfasst: Sa 17.06.06 17:46 
Hi,

einmal mehr will mein theoretisches Vorhaben praktisch nicht gelingen, weshalb ich die ehrenwerte Mitglieder dieses Forums hier anrufen muss:

Ich habe 2 dynamische Arrays, also beispielsweise Arlngonfile und Arlngofffile.

Nun möchte ich überprüfen, ob beide Arrays identisch sind.
Sind sie dies nicht, so sollen alle Ausnahmen ausgegeben werden.

Begonnen habe ich hier mit

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for i:=0 to High(Arlngofffile) do
for j:=0 to High(Arlngonfile) do
if Arlngofffile[i]=Arlngonfile[j] then begin
...
 end;


Der Index von Arlngonfile ist immer >=Arlngoffflie. Werte in Arlngonfile stehen auf jeden Fall in Arlngofffile.

Sobald die obige Bedingung wahr wird, soll nun der übereinstimmende Wert aus Arlngonfile herausgelöscht werden, sodass am Ende nur noch die ungleichen Werte in Arlngonfile stehen.

Wie kann ich das am besten realisieren? Gibt es eine bessere Möglichkeit ?
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Sa 17.06.06 21:07 
Also erst einmal zu deiner Definition von "gleich" bei Arrays: Zwei Arrays A und B sind gleich, wenn Low(A)=Low(B) und High(A)=High(B) und A[i] = B[i] für alle i=Low(A)..High(B). So wie du es machst, sind zwei Arrays nur gleich, wenn sie nur Elemente eines einzigen Wertes beinhalten.
redbird Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Win XP, Vista Business (64bit), Win 7 Prof. (64bit)
Delphi 7, Java, PHP
BeitragVerfasst: Sa 17.06.06 21:31 
Beispiel:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Ar1[0]:='a'; Ar2[0]:='a';
Ar1[1]:='b'; Ar2[1]:='b';
Ar1[2]:='c'; Ar2[2]:='c';
Ar1[3]:='d'; Ar2[3]:='d';
Ar1[4]:='e'; Ar2[4]:='e';
             Ar2[5]:='f';



Ar2[5] soll als unterschiedlicher Wert übrig bleiben.


oder

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Ar1[0]:='a'; Ar2[0]:='a';
Ar1[1]:='b'; Ar2[1]:='b';
Ar1[2]:='d'; Ar2[2]:='c';
Ar1[3]:='e'; Ar2[3]:='d';
             Ar2[4]:='e';


Ar2[2]:='c'; soll als unterschiedlicher Wert übrig bleiben.


Ist nun Ar1[i]=Ar2[j] dann soll Ar2[j] und Ar1[i] gelöscht werden und am Ende sollte nur noch Ar2[2] übrig bleiben.
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Sa 17.06.06 21:43 
Mit anderen Worten, es sollen alle Elemente gefunden werden, die in Ar1 aber nicht in Ar2 oder in Ar2 aber nicht in Ar1 vorhanden sind.
redbird Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Win XP, Vista Business (64bit), Win 7 Prof. (64bit)
Delphi 7, Java, PHP
BeitragVerfasst: Sa 17.06.06 21:54 
Ja es reicht aus alle Elemente zu finden, die nicht in Ar1 aber in Ar2 stehen.

Update:
Ich kann die Elemente, die herausgeschnitten werden sollen auch ausgeben, nur wäre es praktisch, die gleich zu löschen und dem Array dann auch die dementsprechende Größe zu geben (Was innerhalb der IF-Schleife eher unmöglich sein dürfte).

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure Arrayvergleich;
var i, j :integer;
begin
 // Arrays vergleichen
  for i:=0 to High(Arlngofffile) do
    for j:=0 to High(Arlngonfile) do
      if Arlngofffile[i]=Arlngonfile[j] then begin
        if Arlngonfile[j]<>'' then
          showmessage(Arlngonfile[j]);
          Arlngonfile[j]:='';
      end;
end;
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: So 18.06.06 10:17 
Mach halt sowas (ungetestet):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure Arrayvergleich;
var i, j :integer;
    found : integer;
begin
 // Arrays vergleichen
  for i:=0 to High(Arlngofffile) do
  begin
    found := false;
    j := 0;
    while (not found) and (j<=High(Arlngonfile)) do //suche Arlngofffile[i] in Arlngonfile 
    begin
     if Arlngofffile[i]=Arlngonfile[j] then 
      found := true
     else
      inc(j);
    end;

    if not found then
     ShowMessage(Arlngofffile[i]+' gibts nur einmal');
  end;
end;


Am besten arbeitest du aber mit einer THashedStringlist, sonst hast du hier O(n^2).
redbird Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Win XP, Vista Business (64bit), Win 7 Prof. (64bit)
Delphi 7, Java, PHP
BeitragVerfasst: So 18.06.06 11:50 
Danke, deine Anregung brachte mich weiter. Manchmal fokussiert man sich zu sehr auf eine Sache und lässt andere Lösungswege außer Acht. Jetzt funktioniert es jedenfalls.

Habe deinen Code so umgeschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure Arrayvergleich;
var i, j :integer;
    found : boolean;
begin
 // Arrays vergleichen
  for i:=0 to High(Arlngonfile) do
  begin
    found := false;
    j := 0;
    while (not found) and (j<=High(Arlngofffile)) do 
    begin
     if Arlngonfile[i]=Arlngofffile[j] then
      found := true
      else
      inc(j);
    end;

    if found=false then
     ShowMessage(Arlngonfile[i]+' gibts nur einmal');
  end;
end;


THashedStringlist werde ich mir demnächst mal angucken.

Vielen Dank nochmals für die schnelle Hilfe!

Gruß
redbird