[Delphi] arrays combineren

Pagina: 1
Acties:

  • El_kingo
  • Registratie: Mei 2002
  • Laatst online: 17-03-2025
Is het mogelijk om 2 dynamic arrays te combineren naar 1 waarbij gekeken wordt of de waarde uit array1 niet al voorkomt in array2 (dus geen dubbele waarden)?

Of wordt dit gewoon een kwestie van alle waarden uit array1 controleren tegen alle waarden uit array2 en toevoegen als er geen match is? In de help van delphi is hier niks over te vinden.

Als iemand hier dus een functie voor kent of heeft hoor ik dat graag

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Zoek eens op een intersect functie binnen delphi. Zo heet dat namelijk wiskundig :) en daar is vast een standaard functie voor

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Glimi schreef op 12 augustus 2002 @ 23:01:
Zoek eens op een intersect functie binnen delphi. Zo heet dat namelijk wiskundig :) en daar is vast een standaard functie voor
Dat zou me hogelijk verbazen. Wordt zelf proggen denk ik.

He who knows only his own side of the case knows little of that.


  • El_kingo
  • Registratie: Mei 2002
  • Laatst online: 17-03-2025
Ja, intersect bestaat wel, maar alleen voor driehoeken :), heb ik niet zoveel aan, maar bedankt voor de tip, wordt inderdaad zelf proggen dan maar ;(

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Anders zul je het in een set moeten stoppen, hebben ze die ook niet in Delphi? Of iets wat werk met hashes (Map)?

Anders is het algoritme ook niet zo moeilijk hoor

code:
1
2
3
4
5
6
stop array1 in resultarray
   voor elk element in array 2 {
         bestaat deze niet in result array {
             voeg hem toe aan resultarray
         }
    }

  • El_kingo
  • Registratie: Mei 2002
  • Laatst online: 17-03-2025
Ja, ik dacht er ook al aan om het in een set te stoppen, kun je in ieder geval gebruiken maken van de functie 'in', bijkomend probleem is nog de variabele grootte van de array, maar daar werk ik wel omheen...

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  i,j:integer;
  blaat:boolean;

for i := 1 to length(array1)
  blaat:=false;
  for j := 1 to length(array2)
    if array1[j]= array2[i] blaat:=true;
  end;
  if blaat:=false then begin
    setlength(array2, length(array2)+1));  //zoiets dacht ik (de array moet dus 1 groter worden)
    array2[j+1]:=array1[i]
  end;
end;

This message was sent on 100% recyclable electrons.


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

Intersects, unions en differences kunnen wel in Delphi, maar alleen met Sets en niet met Arrays. Ongetest:
code:
1
2
3
4
5
6
7
8
var
  Set1, Set2, Together: set of integer;
begin
  Set1 := [1, 2, 3];
  Set2 := [2, 4];
  Together := Set1 + Set2;
  //Together is nu [1, 2, 3, 4]
end;

[ Voor 0% gewijzigd door Delphi32 op 13-08-2002 00:19 . Reden: Tag vergeten :) ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:45

Creepy

Tactical Espionage Splatterer

BasieP schreef op 12 augustus 2002 @ 23:30:
code:
1
  if blaat:=false then begin
offtopic.. maaruh......Brrr.... eehh...
Ikzelf vind een if (voorwaarde=false then) of een if (voorwaarde=true) then er niet erg netjes uitzien, aangezien if (not voorwaarde) then en if (voorwaarde) hetzelfde doen. Aangezien de uitkomst van een voorwaarde in een if al true of false is (of in elk geval zou moeten zijn :) ), hoef je deze niet meer te vergelijken met true of false.

Je doet bijv toch ook geen (if (x=1)=true) then (niet dat dit in Delphi kan, maar het is maar een voorbeeld he). Dat wordt ook gewoon (if x=1) then.

En als we dan toch bezig zijn: Ook voorkomende constructies zijn dingen zoals
code:
1
2
3
4
if (a and b) then
begin
  c:=true;
end;

of zelfs (!!)
code:
1
2
3
if a then
   if b then
      c:=true;

Bovenstaande 2 kunnen worden herschreven naar
code:
1
c:=a and b;

want a and b is een boolean expressie, en de uitkomst daarvan kan meteen aan c worden toegekend, mits c van het boolean type is natuurlijk

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • jhksema
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:17
Glimi schreef op 12 augustus 2002 @ 23:15:
Anders zul je het in een set moeten stoppen, hebben ze die ook niet in Delphi? Of iets wat werk met hashes (Map)?

Anders is het algoritme ook niet zo moeilijk hoor

code:
1
2
3
4
5
6
stop array1 in resultarray
   voor elk element in array 2 {
         bestaat deze niet in result array {
             voeg hem toe aan resultarray
         }
    }
Let op dat als je het doet volgens Glimi's algoritme, je de arrays wel eerst even sorteert. Anders gaat het kwadratische tijd kosten...

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
Creepy schreef op 13 augustus 2002 @ 08:23:
[...]
offtopic.. maaruh......Brrr.... eehh...
Ikzelf vind een if (voorwaarde=false then) of een if (voorwaarde=true) then er niet erg netjes uitzien, aangezien if (not voorwaarde) then en if (voorwaarde) hetzelfde doen. Aangezien de uitkomst van een voorwaarde in een if al true of false is (of in elk geval zou moeten zijn :) ), hoef je deze niet meer te vergelijken met true of false.

Je doet bijv toch ook geen (if (x=1)=true) then (niet dat dit in Delphi kan, maar het is maar een voorbeeld he). Dat wordt ook gewoon (if x=1) then.

En als we dan toch bezig zijn: Ook voorkomende constructies zijn dingen zoals
code:
1
2
3
4
if (a and b) then
begin
  c:=true;
end;

of zelfs (!!)
code:
1
2
3
if a then
   if b then
      c:=true;

Bovenstaande 2 kunnen worden herschreven naar
code:
1
c:=a and b;

want a and b is een boolean expressie, en de uitkomst daarvan kan meteen aan c worden toegekend, mits c van het boolean type is natuurlijk
sorry hoor, volgende keer zal ik delphi wel opstarten en alles netjes nakijken en testen voordat ik iemand probeer te helpen.. dan krijg ik tenminste geen comentaar van iedereen |:(

This message was sent on 100% recyclable electrons.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:45

Creepy

Tactical Espionage Splatterer

Rustig BasieP! Het is GEEN persoonlijke aanval!

Hier op mijn werk komt het vaker voor dat iemand constructies gebruikt als (if iets=true) then. Daarom reageerde ik. Ik reageerde dan ook specifiek op die constructie! Als ik van iemand anders deze constructie had gezien, had ik uiteraard ook op deze manier gereageerd.

Ik reageerde NIET op fouten in de code. Dat niet iedereen hier altijd z'n code test die wordt gepost is niet meer dan logisch, dat doe ik ook echt niet. En sterker nog, van fouten in geposte code wordt alleen maar meer geleerd, aangezien diegene die de code copy&paste gedwongen wordt om ff de code te bekijken!

En nog sterker: Delphi ACCEPTEERT code als if (iets=true) then aangezien het syntactisch gezien correct is! Er komt zelfs geen warning of hint message!

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Ok: sorteer de twee arrays A en B met quicksort, en loop er dan tegelijk door heen, waarbij je telkens het kleinste element van de twee arrays aan een result-array C toevoegt. Als ze hetzelfde zijn heb je een duplicaat gevonden en voeg je maar een van de twee aan C toe. Dit (optimale) algoritme loopt in O(n), samen met sorteren in O(n log n). Een klein voorbeeldje:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
I := 0;
J := 0;
K := 0;
while I < Length(A) do begin
  while J < Length(B) do begin
    if A[I] < B[J] then begin
      C[K] := A[I];
      Inc(I);
    end
    else if A[I] > B[J] then begin
      C[K] := B[J];
      Inc(J);
    end
    else begin
      C[K] := A[I];
      Inc(I);
      Inc(J);
    end;
    Inc(K);
  end;
end;


Succes!

Verwijderd

Uffa, A moet A[I] zijn hierboven... misschien doet de PHP highlighting het toch niet zo goed hier

Verwijderd

ik bedoel A [ I ] dus

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:40
Fluidfreaks' algoritme handhaaft overigens de oorspronkelijke volgorde van de arrays niet. Dit is waarschijnlijk niet zo'n probleem, aangezien het moeilijk is om een zinnige manier te verzinnen waarop de arrays geordend zouden moeten worden.

Zelf zou ik er in het geval van grote arrays trouwens voor kiezen om de string waarden in een hash table te zetten (waarbij duplicaten uiteraard niet toegevoegd worden) en vervolgens de inhoud van de hash table in een array te stoppen. Het is altijd moeilijk om aan te geven wat de tijdcomplexiteit van zo'n algoritme is, maar in veel gevallen (bij een geschikte hash table implementatie) zal het in de buurt van O(n) liggen.

Zowel fluidfreak als ik gaan er trouwens van uit dat het vergelijken van twee strings (en het bereken van een hashwaarde in mijn geval) in constante tijd gebeurt. In de praktijk zal dit niet het geval zijn.

Verwijderd

Goeie opmerkingen! Hoe kun je trouwens aangeven dat je een stukje code intypt? De php tag werkte niet zo goed, en ik kon niet iets als [pre] vinden.
Pagina: 1