Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Doppelte Array Einträge entfernen
HenryHux - So 17.10.10 22:45
Titel: Doppelte Array Einträge entfernen
Hi, immoment habe ich ein Int-Array aus 6-7 Werten.
Bis jetzt habe ich immer so herausgefunden, ob ein Wert gepaired ist.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var IntArray : array [1..10] of integer; Index : integer; ... Index := 1; Result := false; while (Index < 10) and (not Result) do begin if IntArray[Index] = IntArray[Index + 1] then 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
Hidden - 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:
jaenicke: 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,
HenryHux - 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?
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 < 5) do begin if array[Index] = array[Index + 1] then begin array[Index]:=array[j]; j:=j-1; inc(doubles); end; Inc(Index); if doubles=1 then setlength (array, 4); if doubles=2 then setlength (array, 3); if doubles=3 then setlength (array, 2); end; |
Edit: da stimmt was nicht :D
HenryHux - So 17.10.10 23:51
So nochmal:
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 < 5) do begin if array[Index] = array[Index + 1] then begin dummy:=array[j]; array[j]:=array[index+1]; array[index+1]:=dummy; j:=j-1; inc(doubles); end; Inc(Index); if doubles=1 then setlength (array, 4); if doubles=2 then setlength (array, 3); if doubles=3 then setlength (array, 2); 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 - Mo 18.10.10 00:20
Ich würde das so machen:
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; j := i; while i <= High(Arr) do begin if Arr[i-1] <> Arr[i] then begin Arr[j] := Arr[i]; Inc(j); end; Inc(i); end; SetLength(Arr, j - Low(Arr) + 1); end; |
[[Beware of bugs in the above code: I have not tested it.]]
E: Korrektor von
jaenicke eingepflegt :)
lg,
jaenicke - Mo 18.10.10 00:32
Hidden hat folgendes geschrieben : |
Ohne Sortieren ist hat man damit zwei Schleifen ineinander |
HenryHux hat folgendes geschrieben : |
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. ;-)
Hidden hat folgendes geschrieben : |
[[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:
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); |
Gerd Kayser - Mo 18.10.10 09:20
jaenicke hat folgendes geschrieben : |
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 - Mo 18.10.10 09:48
Gerd Kayser hat folgendes geschrieben : |
Ich würde einfach eine downto-Schleife nehmen. |
Wozu? :gruebel:
HenryHux - 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 - Mo 18.10.10 11:27
HenryHux hat folgendes geschrieben : |
und die von jaenicke verwirrt mich ein bisschen. |
Also bei mir funktioniert das alles. :nixweiss:
HenryHux - Mo 18.10.10 11:44
Hmm vielleicht mache ich ja auch was falsch.
Also so siehts bei mir aus:
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 - Mo 18.10.10 11:51
Ähm... *räusper*
HenryHux hat folgendes geschrieben : |
Sollte vlt noch sagen, dass die Zahlen aufsteigend sortiert sind. |
Gerd Kayser - Mo 18.10.10 11:53
jaenicke hat folgendes geschrieben : |
Wozu? :gruebel: |
Ich würde es so realisieren:
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 SetLength(IntArray, 10); for Schleife := 0 to 9 do IntArray[Schleife] := Schleife + 1; IntArray[1] := 3; IntArray[3] := 3; IntArray[7] := 7;
for Schleife := 9 downto 1 do begin if IntArray[Schleife] = IntArray[Schleife - 1] then begin Rest := Length(IntArray) - Schleife; Move(IntArray[Schleife], IntArray[Schleife - 1], SizeOf(integer) * Rest); SetLength(IntArray, Length(IntArray) - 1); end; end; Label1.Caption := 'Fertig'; end; |
HenryHux - Mo 18.10.10 12:00
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 - Mo 18.10.10 12:50
HenryHux hat folgendes geschrieben : |
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]
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!