Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 2 DynArrays zusammenfuegen (https://www.delphipraxis.net/128154-2-dynarrays-zusammenfuegen.html)

Lucaito 25. Jan 2009 10:45


2 DynArrays zusammenfuegen
 
Hallo!

Wollt mal fragen wie man 2 dynamische Arrays mit dem Reißverschlussprinzip zusammenfuegt. :/
Hab mich selbst scho probiert, aber irgendwie komm ich noch nich ganz auf die Loesung. xD
Achja, die beiden Arrays haben sehr wahrsch. verschiedene Groessen! Deshalb find ich des recht schwierig...

Danke schonma fuer Antworten, Luca!

mkinzler 25. Jan 2009 10:47

Re: 2 DynArrays zusammenfuegen
 
Wie hast du es versucht? Such mal nach Mischen.

SirThornberry 25. Jan 2009 10:50

Re: 2 DynArrays zusammenfuegen
 
die Frage ist wie du außerhalb der Programmierung 2 mengen im Reisverschlussprinzip zusammenfügst.

Ich würde einmal aus der einen Kiste was nehmen, dann aus der anderen und das solange bis eine Kiste von beiden leer ist. Danach einfach die restlichen Sachen der noch befüllten Kiste hinten anfügen.

In der Programmierung ist es nicht viel anders. Erstmal schauen wieviel Platz man braucht (Anzahl des einen Arrays + Anzahl des zweiten Arrays.
Dann das kleinere Array von beiden durchgehen und die Elemente in jedes zweite Feld des neuen Arrays stopfen (Index * 2)
Danach das größere Array nehmen und bis zur Anzahl des kleinen Arrays die lücken stopfen. Dahinter dann den Rest des größeren Arrays kopieren.

Scooty78 25. Jan 2009 11:26

Re: 2 DynArrays zusammenfuegen
 
versuchs mal so:

Delphi-Quellcode:
 setlength(array3,(length(array1)+length(array2)));

  x := -1;
  for I := 0 to length(array1) - 1 do
    begin
      inc(x);
      array3[x] := array1[i];
      if i <= length(array2)-1 then
      begin
        inc(x);
        array3[x] := array2[i];
      end;
    end;

  if length(array2)> length(array1) then
    begin
      for I := length(array1)-1 to length(array2) - 1 do
        begin
          inc(x);
          array3[x] := array2[i];
        end;
    end;
Gruß
Scooty

himitsu 25. Jan 2009 12:39

Re: 2 DynArrays zusammenfuegen
 
auch will ... auch will ... *hibblig rumhüpf* :firejump:
Delphi-Quellcode:
SetLength(array3, Length(array1) + Length(array2));
z := Min(Length(array1), Length(array2));
x := 0;
For i := 0 to z - 1 do Begin
  array3[x] := array1[i];
  Inc(x);
  array3[x] := array2[i];
  Inc(x);
End;
For i := z to High(array1) do Begin
  array3[x] := array1[i];
  Inc(x);
End;
For i := z to High(array2) do Begin
  array3[x] := array2[i];
  Inc(x);
End;
und in Kurz:
Delphi-Quellcode:
SetLength(array3, Length(array1) + Length(array2));
z := Min(Length(array1), Length(array2));
For i := 0 to z - 1 do Begin
  array3[i * 2]    := array1[i];
  array3[i * 2 + 1] := array2[i];
End;
For i := z to High(array1) do array3[z + i] := array1[i];
For i := z to High(array2) do array3[z + i] := array2[i];

Neutral General 25. Jan 2009 12:43

Re: 2 DynArrays zusammenfuegen
 
-Unsinn-

Apollonius 25. Jan 2009 12:44

Re: 2 DynArrays zusammenfuegen
 
Er will die Arrays nach dem Reißverschlussprinzip zusammenfügen, General.

himitsu 25. Jan 2009 12:48

Re: 2 DynArrays zusammenfuegen
 
@Neutral General:
auch wenn es hier nicht stimmt ... sobald bestimmte Struckturen in dem Array enthalten sind (er hat ja nicht gesagt von welchem Typ sein Array ist), dann kann es damit schöne Speicherprobleme geben

versuch deinen z.B. mal mit Array of String :stupid:
also davor sollte man bei sowas schon warnen :angel:

Lucaito 25. Jan 2009 16:21

Re: 2 DynArrays zusammenfuegen
 
Korrekt, is n Array vom Typ t_inhalt, un t_inhalt wiederum is als type definiert mit string^^
Delphi-Quellcode:
type t_inhalt : string
So, und da mir meine 'liebe' Mutter direkt nachdem ich die Frage geschrieben habe, den WLan-Stick abgenommen hat, musste ich selbst nachdenken. :/
Also 'n Blatt Papier genommen un des mal durchgegangen. ^^
Bin auf ne schicke Lösung ohne 3tes Array gekommen :D
Delphi-Quellcode:
  t := 1;
  for i := 0 to high(schlange2.inhalt) do
    begin
      array_size(inc);
      for j := high(schlange.inhalt) downto t do
        schlange.inhalt[j] := schlange.inhalt[j-1];
      schlange.inhalt[t] := schlange2.inhalt[i];
      t := t+2;
    end;
Trotzdem danke an alle. ^___^

Greetz, Luca

himitsu 25. Jan 2009 17:05

Re: 2 DynArrays zusammenfuegen
 
Also Strings sind Typen, welche initialisiert und finalisiert werden müssen, was bei Move/MoveMemory natürlich nicht der Fall ist.

Zitat:

musste ich selbst nachdenken. :/
Also 'n Blatt Papier genommen un des mal durchgegangen. ^^
Bin auf ne schicke Lösung ... gekommen :D
gut gemacht ^^
und soweit ich das seh, sollte diese auch funktionieren :thumb:


Zitat:

Bin auf ne schicke Lösung ohne 3tes Array gekommen :D
OK, das hattest du nicht gesagt, also daß es auch direkt im Array eingefügt werden soll.

Delphi-Quellcode:
for j := high(schlange.inhalt) downto t do
  schlange.inhalt[j] := schlange.inhalt[j-1];
was man hier noch optimieren könnte, wäre das ständig weiterschieben alle nachfolgenden Einträge

hier werden z.B. erstmal alle Einträge im array1 an ihre neue Position verschoben
und anschließend nur noch die Einträge aus array2 in die entstandenen Freiräume eingefügt.
Delphi-Quellcode:
a := Length(array1);
n := a + Length(array2);
z := Min(a, Length(array2));
SetLength(array1, n);
For i := a - 1 downto z do array1[z + i] := array1[i];
For i := z - 1 downto 1 do array1[i * 2] := array1[i];
For i := 0 to z - 1 do array1[i * 2 + 1] := array2[i];
For i := z to High(array2) do array1[z + i] := array2[i];
für das Verständnis:
die 1. Schleife verschiebt alles, was zusammenhängend von array1 am Ende des gemeinsamen Arrays steht (falls vorhanden).
die 2. Schleife verschiebt die Elemente im gemeinsamen Anteil.
die 3. Schleife fügt die Elemente von array2 in den gemeinsamen Anteil.
die 4. Schleife hängt die übrigen Teile an, welche nach dem gemeinsamen Teil liegen (falls vorhanden).

im gemeinsamen Teil sind die Einträge dann nach dem Reisverschlußprinzip verteilt.

Lucaito 25. Jan 2009 17:15

Re: 2 DynArrays zusammenfuegen
 
Ich find meine Loesung irgendwie uebersichtlicher... xD"

Ach, FUCK! O_O
Hab ganz vergessen, dass ich noch ne Ueberpruefung machen muss, welches Array groeßer is. -.-

himitsu 25. Jan 2009 17:26

Re: 2 DynArrays zusammenfuegen
 
diese Prüfung ist bei mir überall schon drin :mrgreen:
(beim letzen Code wird immer array2 in array1 eingefügt)

*guck* stümmt, bei dir wäre es schon besser.

Nja, hab ja nicht gsagt, daß es unbedingt übersichtlicher ist,
aber ich find soooooooooo unübersichtlich ist dann doch nicht. :angel2:
Nur bei vielen Einträgen geht es so schneller und vom Speicherrumgeschaufle her, isses och optimaler :angel:

Ansonsten ist deines, vom Prinzip her schon OK.

Lucaito 25. Jan 2009 17:31

Re: 2 DynArrays zusammenfuegen
 
Naja, ich sags mal so:
Ich lern seit 3(?) Monaten Delphi(schulisch) un mach grad die HA von 'nem Kumpel der in ne Klasse ueber mir is... :)
Deshalb versteh ich dein Code vllt au einfach noch nich so gut ;D
Ich hab bei mir jetz einfach ne if..then..else-Abfrage eingefuegt, den Misch-Code kopiert und dann angepasst.^^
Is zwar mehr Code-Volumen aber fuer mich (noch) verstaendlicher ;3

SubData 25. Jan 2009 18:35

Re: 2 DynArrays zusammenfuegen
 
Zitat:

Zitat von Lucaito
Ich hab bei mir jetz einfach ne if..then..else-Abfrage eingefuegt, den Misch-Code kopiert und dann angepasst.^^
Is zwar mehr Code-Volumen aber fuer mich (noch) verstaendlicher ;3

Lieber so, als Code verwenden, den du nicht verstehst und damit nix lernst ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.

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