Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Werte aus dynamischen array löschen (https://www.delphipraxis.net/175412-werte-aus-dynamischen-array-loeschen.html)

jupiter4065139 19. Jun 2013 16:11

Werte aus dynamischen array löschen
 
Hallo,

ich hab mir meine Werte aus einem stream in ein array eingelesen

Delphi-Quellcode:
while Stream.Position < Stream.Size do begin
            Stream.ReadBuffer(Digit, SizeOf(Digit));
            Inc(byte);
 time:= time+ 1/250;
setlength(arr,stream.size);
arr[fs.position].zeit:= time;
arr[fs.position].wert:=Digit;
ich wollt mir jetzt ne schleife bauen, worin die Zeitwerte in einem bestimmten Bereich gelöscht werden. Die jeweiligen digit werte sollen aber auch mit gelöscht werden. D.h. die gesamte Zeile soll gelöscht werden.
Delphi-Quellcode:
               Begin
               If (median[FS.Position].Zeit > 0.1 and median[FS.Position].Zeit < 0.2) then
             
               begin
                  // hier dachte ich steht der code zum löschen
              end;
              end;
kann da jemand ein tipp geben?

baumina 19. Jun 2013 16:57

AW: Werte aus dynamischen array löschen
 
http://www.delphi-treff.de/tipps/obj...ecke-entsteht/

Uwe Raabe 19. Jun 2013 17:03

AW: Werte aus dynamischen array löschen
 
Tip: Wenn du über eine for-Schleife Elemente aus einem Array löscht, dann lass die Schleife rückwärts laufen.

BUG 19. Jun 2013 22:21

AW: Werte aus dynamischen array löschen
 
Ich würde eher an sowas denken:
Delphi-Quellcode:
var aArray: array of Something;
var writePos, readPos, retained: integer;
//...
writePos := 0;
retained := 0;
for readPos := 0 to length(aArray)-1 do
begin
  if condition(aArray[readPos]) then
  begin
    if (readPos <> writePos) then aArray[writePos] := aArray[readPos];
    inc(writePos);
    inc(retained);
  end;
end;
setLength(aArray, retained);
Also insgesamt: Die Elemente, die du behalten willst, am Anfang des Arrays anordnen.
Dabei werden möglicherweise unerwünschte überschrieben und erwünschte dupliziert. Dann wird der Rest einfach abgeschnitten (setLength).

Das Ganze könnte man eventuell als generische filter-Operation für Arrays verpacken, aber ich bin nicht so fit mit Generics in Delphi.

Bummi 19. Jun 2013 22:28

AW: Werte aus dynamischen array löschen
 
:gruebel:

BUG 19. Jun 2013 22:46

AW: Werte aus dynamischen array löschen
 
Zitat:

Zitat von Bummi (Beitrag 1219124)
:gruebel:

Möchte jupiter nicht mehrere Zeilen löschen, bei denen eine bestimmte Bedingung zutrifft :gruebel:

Bummi 19. Jun 2013 22:54

AW: Werte aus dynamischen array löschen
 
Ich habe es nicht getestet, aber wenn z.B. Element 5 gelöscht werden soll, würde IMHO Element
0 mit dem Wert von Element 5 überschrieben und das letzte Element z.B. 10 nach dem Durchlauf gelöscht ....
writePos und retained beinhalten die selben Werte ...

Wenn Condition invers gemeint ist fehlt IMHO ein else Zweig

Zitat:

var aArray: array of Something;
var writePos, readPos, retained: integer;
//...
writePos := 0;
retained := 0;
for readPos := 0 to length(aArray)-1 do
begin
if condition(aArray[readPos]) then
begin
if (readPos <> writePos) then aArray[writePos] := aArray[readPos];
inc(writePos);
inc(retained);
end;
end;
setLength(aArray, retained);

BUG 19. Jun 2013 23:22

AW: Werte aus dynamischen array löschen
 
Zitat:

Zitat von Bummi (Beitrag 1219126)
Wenn Condition invers gemeint ist fehlt IMHO ein else Zweig

OK, stimmt ... das ist verwirrend:
Delphi-Quellcode:
condition(element)
soll
Delphi-Quellcode:
true
sein, wenn
Delphi-Quellcode:
element
im Array behalten werden soll.
Mir ist aber nicht klar, was für ein else-Zweig fehlen sollte?


Angenommen ich will aus dem Array [0 1 2 3 4] alle geraden Zahlen herausfiltern.


Vor 1. Schleifendurchlauf:
Code:
         [0 1 2 3 4]
readPos   0
writePos  0
retained 0
Vor 2. Schleifendurchlauf:
Code:
         [0 1 2 3 4]
readPos     1
writePos    1
retained   1
Vor 3. Schleifendurchlauf:
Code:
         [0 1 2 3 4]
readPos       2
writePos    1
retained    1
Vor 4. Schleifendurchlauf:
Code:
         [0 2 2 3 4]
readPos         3
writePos      2
retained     2
Vor 5. Schleifendurchlauf:
Code:
         [0 2 2 3 4]
readPos           4
writePos      2
retained     2
Ende der Schleife:
Code:
         [0 2 4|3 4]
readPos?       |
writePos       |3
retained       3

setLength(aArray, retained) => [0 2 4]
Dabei fällt mir auf, dass
Delphi-Quellcode:
writePos
und
Delphi-Quellcode:
retained
immer gleich sind; man könnte sich also eine der Variablen sparen :mrgreen:

Bummi 20. Jun 2013 06:18

AW: Werte aus dynamischen array löschen
 
versuch es mal mit einem Array von 0 bis 9 und der Bedingung
Delphi-Quellcode:
if ((aArray[readPos]))=5 then
Mit einem kleinen Umbau sollte es funktionieren

Delphi-Quellcode:
var
  aArray: array of Integer;
  i, writePos, readPos, retained: Integer;

  Function Condition(i: Integer): Boolean;
  begin
    //Result := (i and 1)=0 ;
    Result := i in [0, 3, 7];
  end;

begin
  writePos := 0;
  retained := 0;

  setlength(aArray, 10);
  For i := 0 to 9 do
    aArray[i] := i;

  retained := Length(aArray);
  for readPos := 0 to Length(aArray) - 1 do
  begin
    if Condition(aArray[readPos]) then
    begin
      dec(retained);
      dec(writePos);
    end
    else
      aArray[writePos] := aArray[readPos];
    inc(writePos);
  end;
  setlength(aArray, retained);
end;

BUG 20. Jun 2013 07:36

AW: Werte aus dynamischen array löschen
 
Zitat:

Zitat von Bummi (Beitrag 1219130)
versuch es mal mit einem Array von 0 bis 9 und der Bedingung
Delphi-Quellcode:
if ((aArray[readPos]))=5 then

Heraus kommt (wie erwartet) das Array [5].

Delphi-Quellcode:
  var
  aArray: array of Integer;
  i, writePos, readPos, retained: Integer;

  Function retainElement(i: Integer): Boolean;
  begin
    //Result := (i and 1)=0 ;
    //Result := i in [0, 3, 7];
    Result := i = 5;
  end;

  procedure print(a: array of integer);
  var i: integer;
  begin
    for i := 0 to length(a)-1 do WriteLn(a[i]);
  end;


begin
  writePos := 0;
  retained := 0;

  setlength(aArray, 10);
  For i := 0 to 9 do
    aArray[i] := i;

  writePos := 0;
  retained := 0;
  for readPos := 0 to length(aArray)-1 do
  begin
    if retainElement(aArray[readPos]) then
    begin
      if (readPos <> writePos) then aArray[writePos] := aArray[readPos];
      inc(writePos);
      inc(retained);
    end;
  end;
  setLength(aArray, retained);

  print(aArray);
  readln;
end.

Unser Code unterscheidet sich nur:
  • in der Bedeutung von
    Delphi-Quellcode:
    condition(aArray)
    ,
  • der Zählrichtung von
    Delphi-Quellcode:
    retained
    ,
  • darin, dass du
    Delphi-Quellcode:
    writePos
    immer inkrementierst, aber im Falle des Löschens eines Elements vorher dekrementierst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz