Autor |
Beitrag |
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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.
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
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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,
_________________ 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 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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
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 
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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,
_________________ 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 18.10.10 00:32
Für diesen Beitrag haben gedankt: HenryHux, Hidden
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 18.10.10 09:48
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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
Hat noch jemand Ideen?
Danke,
Lg
Henry
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 18.10.10 11:27
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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?
Aber wie gesagt, vlt mache ich auch was falsch.
Hätte aber keine Idee wie man den Fehler beheben kann..
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mo 18.10.10 11:53
Für diesen Beitrag haben gedankt: HenryHux
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mo 18.10.10 12:00
Ok  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
Danke,
Lg
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: 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]
|
|