Autor Beitrag
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: So 17.10.10 22:45 
Hi, immoment habe ich ein Int-Array aus 6-7 Werten.
Bis jetzt habe ich immer so herausgefunden, ob ein Wert gepaired ist.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  IntArray : array [1..10of integer;
  Index    : integer;
...
  Index := 1;
  Result := false;
  while (Index < 10and (not Result) do
    begin
      if IntArray[Index] = IntArray[Index + 1then
        Result := true;
      Inc(Index);
    end;


Jetzt reicht das aber nicht mehr, ich muss die doppelten Werte 'rauskicken'.
Aber leider keine Idee, wie ich das machen soll -.-

Kann mir jemand helfen?

Lg

Henry
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 17.10.10 23:02 
Hier findest du einen sehr einfachen Algorithmus. Dort bezogen auf Strings, aber das geht bei Arrays ja analog:
www.delphi-forum.de/....php?p=620893#620893
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: So 17.10.10 23:02 
Moin!

Kommt es dir dabei auf die Reihenfolge an, in der die Arraywerte angeordnet sind?
Wenn ja, dann macht es auch einen Unterschied, welchen Eintrag du bei einem Wertepaar entfernst: Soll stets der vorderste bleiben, ..
Wenn nein: Sortiere dein Array, und verfahre danach, wie du es bisher tust.

E: user profile iconjaenicke: Zum entfernen eines bestimmten Wertes - gut. Aber alle Werte des Arrays sollen paarweise verschieden sein. Ohne Sortieren ist hat man damit zwei Schleifen ineinander, das geht auch. Ist aber ein wenig langsamer.

lg,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: So 17.10.10 23:39 
Sollte vlt noch sagen, dass die Zahlen aufsteigend sortiert sind.
Kriege es aber nicht ganz hin, habe versucht ein Wert des Paares nach hinten zu setzen und hinterher den Array zu kürzen.
So eine Idee während des Postens gehabt :D
Klappt es so?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
  
  doubles:=0;
  Index := 0;
  j:=5;
  Result := false;
  while (Index < 5do
  begin
    if array[Index] = array[Index + 1then
    begin
     array[Index]:=array[j];
     j:=j-1;
     inc(doubles);
    end;
     Inc(Index);
     if doubles=1 then
      setlength (array4);
     if doubles=2 then
      setlength (array3);
     if doubles=3 then
      setlength (array2);
    end;


Edit: da stimmt was nicht :D
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: So 17.10.10 23:51 
So nochmal:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
  doubles:=0;
  Index := 0;
  j:=5;
  while (Index < 5do
  begin
    if array[Index] = array[Index + 1then    //doppelte einträge sollen nach hinten gestellt werden
    begin
      dummy:=array[j];                           //dummy nimmt letze positions des arrays
      array[j]:=array[index+1];                  //letzte position wird dem paar zugewiesen
      array[index+1]:=dummy;                     //paar wird mit letztem wert überschrieben
      j:=j-1
      inc(doubles);
    end;
    Inc(Index);
    if doubles=1 then
      setlength (array4);
    if doubles=2 then
      setlength (array3);
    if doubles=3 then
      setlength (array2);
  end;



Denke, das dürfte so klappen. Danach müsste ich aber nochmal die Werte sortieren.
Ist das ne halbwegs gute Lösung?

Lg
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mo 18.10.10 00:20 
Ich würde das so machen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
type
  TIntArray = Array of Integer;

{..}

procedure RemoveAllFurtherInstances(var Arr: TIntArray);
begin
  Sort(Arr);
  i := Low(Arr) + 1;  //Lesen, von links:
  j := i;  //Schreiben: In's selbe Array, da wir dieses nicht mehr brauchen
  while i <= High(Arr) do begin       //Wir lesen bis zum rechten Ende:
    if Arr[i-1] <> Arr[i] then begin  //verschiedene Einträge..
      Arr[j] := Arr[i];                 //schreiben wir ab
      Inc(j);                           //(dann natürlich den Schreibkopf auch eins weiter setzen)
    end;  //gleiche Elemente werden nicht übernommen, und fallen somit weg
    Inc(i);
  end;
  SetLength(Arr, j - Low(Arr) + 1);  //Am Schluss alles weg, das das alte Array länger war
end;


[[Beware of bugs in the above code: I have not tested it.]]
E: Korrektor von user profile iconjaenicke eingepflegt :)

lg,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)


Zuletzt bearbeitet von Hidden am Mo 18.10.10 00:41, insgesamt 3-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 18.10.10 00:32 
user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:
Ohne Sortieren ist hat man damit zwei Schleifen ineinander
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Sollte vlt noch sagen, dass die Zahlen aufsteigend sortiert sind.
Das war mir nach deinem ersten Quelltext schon klar, sonst hätte der ja auch nicht funktioniert. ;-)

user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:
[[Beware of bugs in the above code: I have not tested it.]]
Das kann ich mir denken. ;-)
Ohne es ausprobiert zu haben, aber da deine Schleife bis Length(Arr) läuft und du auf den Index zugreifst, kann das nicht klappen. Da hast du, wenn ich das richtig sehe, am Ende einen fehlerhaften Eintrag zu viel im Ergebnisarray. Und wenn das Array leer ist, setzt du es am Ende dennoch auf die Länge 1.

Ich würde es aber auch so machen wie du:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
var
  i, CurLength: Integer;
begin
  i := Succ(Low(MyArray));
  if Length(MyArray) > 0 then
    CurLength := 1
  else
    CurLength := 0;
  while i <= High(MyArray) do
  begin
    if MyArray[Pred(i)] <> MyArray[i] then
    begin
      MyArray[CurLength] := MyArray[i];
      Inc(CurLength);
    end;
    Inc(i);
  end;
  SetLength(MyArray, CurLength);

Für diesen Beitrag haben gedankt: HenryHux, Hidden
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mo 18.10.10 09:20 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ohne es ausprobiert zu haben, aber da deine Schleife bis Length(Arr) läuft und du auf den Index zugreifst, kann das nicht klappen. Da hast du, wenn ich das richtig sehe, am Ende einen fehlerhaften Eintrag zu viel im Ergebnisarray.
Ich würde einfach eine downto-Schleife nehmen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 18.10.10 09:48 
user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde einfach eine downto-Schleife nehmen.
Wozu? :gruebel:
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Mo 18.10.10 11:07 
Hi, danke erstmal.
Irgendwie wird meine eigene Konstruktion jetzt schon ziemlich lang deswegen hier nochmal fragen =)
Ich hatte eure mal ausgetestet, die von Hidden lässt die letzte Zahl einfach stehen, auch wenn die nicht doppelt ist
und die von jaenicke verwirrt mich ein bisschen. Wenn die Eingabewerte zum Beispiel 1,2,2,3,4,5 sind verwandelt sich zum Beispiel eine 2 in ne 4 so das rauskommt : 1,2,3,4,4,5.
Auch hier könnte ich das Ende nicht einfach abschneiden, da dort ja noch eine ungepaarte Zahl, die 5 steht.
Ich komm auf keine Lösung :roll:
Hat noch jemand Ideen?
Danke,

Lg

Henry
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 18.10.10 11:27 
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
und die von jaenicke verwirrt mich ein bisschen.
Also bei mir funktioniert das alles. :nixweiss:
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Mo 18.10.10 11:44 
Hmm vielleicht mache ich ja auch was falsch.
Also so siehts bei mir aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
var
  i, CurLength: Integer;
  myarray : array of integer;
begin
  setlength(myarray,5);
  myarray[0]:=5;
  myarray[1]:=3;
  myarray[2]:=3;
  myarray[3]:=5;
  myarray[4]:=1;
  myarray[5]:=2;
  i := Succ(Low(MyArray));
  if Length(MyArray) > 0 then
    CurLength := 1
  else
    CurLength := 0;
  while i <= High(MyArray) do
  begin
    if MyArray[Pred(i)] <> MyArray[i] then
    begin
      MyArray[CurLength] := MyArray[i];
      Inc(CurLength);
    end;
    Inc(i);
  end;
  SetLength(MyArray, CurLength);
  showmessage(inttostr(myarray[0])+' '+inttostr(myarray[1])+' '+inttostr(myarray[2])+' '+inttostr(myarray[3])+' '+
    inttostr(myarray[4])+' '+inttostr(myarray[5]));
end;

Er gibt mir 535112 aus. Ist nicht im Sinne des Erfinder oder? :D
Aber wie gesagt, vlt mache ich auch was falsch.
Hätte aber keine Idee wie man den Fehler beheben kann..
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 18.10.10 11:51 
Ähm... *räusper*
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Sollte vlt noch sagen, dass die Zahlen aufsteigend sortiert sind.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mo 18.10.10 11:53 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wozu? :gruebel:
Ich würde es so realisieren:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
type
  TIntArray = array of integer;

procedure TMainform.Button1Click(Sender: TObject);
var
  IntArray : TIntArray;
  Schleife : integer;
  Rest     : integer;
begin
  // Array füllen

  SetLength(IntArray, 10);
  for Schleife := 0 to 9 do
    IntArray[Schleife] := Schleife + 1;
  IntArray[1] := 3;
  IntArray[3] := 3;
  IntArray[7] := 7;

  // Array enthält jetzt die Werte (1, 3, 3, 3, 5, 6, 7, 7, 9, 10)

  // doppelte Werte löschen

  for Schleife := 9 downto 1 do
    begin
      if IntArray[Schleife] = IntArray[Schleife - 1then
        begin
          Rest := Length(IntArray) - Schleife;
          Move(IntArray[Schleife], IntArray[Schleife - 1], SizeOf(integer) * Rest);
          SetLength(IntArray, Length(IntArray) - 1);
        end;
    end;
  Label1.Caption := 'Fertig';  // mein Breakpoint fürs Debuggen ;-)
end;

Für diesen Beitrag haben gedankt: HenryHux
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Mo 18.10.10 12:00 
Zitat:
Ähm... *räusper*

Ok :D Das kommt vom verzweifelten weglöschen vom Code und dem Copy/pasten ausm Forum...
Der Code von Gerd Kayser hat mich gerade erstmal aufmerksam drauf gemacht, wieso vlt bei mir die letzte Zahl immer hinterherhinkt.
Wenn ich nen array of Integer habe.
Und ich will den auf 6 Werte setten.
Ist es setlength 6 oder 5?
Und jetzt teste ich den 2ten Code :D
Danke,

Lg
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mo 18.10.10 12:50 
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich nen array of Integer habe.
Und ich will den auf 6 Werte setten.
Ist es setlength 6 oder 5?
SetLength(<Anzahl der Elemente>)
Angesprochen werden die dann mit Array[0] bis Array[<Anzahl der Elemente> - 1]