![]() |
Delphi-Version: 5
Löschen einer Generischen Liste
Delphi-Quellcode:
while i <= result.Count - 1 do
begin a := 0; ElementeZumLoeschen := Tlist<integer>.create; repeat if result[i].isDominated(result[a]) then begin if ElementeZumLoeschen.IndexOf(a) = -1 then begin ElementeZumLoeschen.Add(a); end; end; if result[i].isDominated(result[result.Count - 1 - a]) then begin if ElementeZumLoeschen.IndexOf(result.Count - 1 - a) < 0 then ElementeZumLoeschen.Add(result.Count - 1 - a); end; inc(a); until (a > result.Count div 2); for a := 0 to ElementeZumLoeschen.Count - 1 do result.Delete(ElementeZumLoeschen[a]- a ); freeandnil(ElementeZumLoeschen); inc(i); end; bei den oben zu sehenden Code habe ich eine Liste, wenn folgende bestimmung erfüllt sind, merke ich mir den Index. in einer For schleife laufe ich dann die Inhalte durch, mti den INdexen die gelöscht werden soll. Problem; ich bekomm eine outofrange. Sieht wer aufm Blick, was dort schief gelaufen ist ? Oder gibt es noch ne andere Möglichkeit? ( laut DP suche, eine toarray Methode. Da ich dort aber eine Kopie meiner Liste erstelle, würde ich dies gern vermeinden) |
AW: Löschen einer Generischen Liste
.. beim Löschen ist es von Vorteil die Liste rückwärts zu durchlaufen.
Grüße Klaus |
AW: Löschen einer Generischen Liste
Ich steig bei dem Code zwar nicht ganz durch (und Delphi 5 mag ich auch nicht glauben), aber wenn die Liste die Elementindizes der anderen Liste aufnimmt, solltest Du diese rückwärts durchlaufen. Und wieso ziehst Du a wieder ab beim Löschen?
|
AW: Löschen einer Generischen Liste
like :
Delphi-Quellcode:
for a := ElementeZumLoeschen.Count - 1 downto 0 do
result.Delete(ElementeZumLoeschen[a]); @edit ich zähl ab, da die Liste doch kleiner wird, oder ist ´sie nicht dynamissch ? |
AW: Löschen einer Generischen Liste
Deine For-Schleife schaut nur ein einziges mal, bis wohin sie zählen soll. In z.B. C++ ist das anders, da kannst du eine Bedingung angeben.
Hier ein Minimalbeispiel, schau dir doch im Debugger mal an, wie myList immer kleiner wird, dein Index immer größer und dann kracht es:
Delphi-Quellcode:
procedure TForm19.FormCreate(Sender: TObject);
var myList: TList<Integer>; myListIndex: Integer; begin myList := TList<Integer>.Create(); myList.AddRange([1,2,3,4,5,6,7,8,9,10]); for myListIndex := 0 to Pred(myList.Count) do if (myListIndex mod 2 = 0) then myList.Delete(myListIndex); end; PS: Was du genau da genau machst habe ich aber nach mehreren Anläufen immer noch nicht verstanden. Variablennamen wie a und i sind zwar schnell getippt, aber ich komme ehrlich gesagt immer noch ganz hinterher. Willst du aus einer Liste schlichtweg alle Dinge entfernen, auf welche eine bestimmte Eigenschaft zutrifft? |
AW: Löschen einer Generischen Liste
Zitat:
und a / i sind laufvariablen. Sollte ich da echt laufvariable 1 und 2 hinschreiben ? ;-) [EDIT] ich weiß, das die liste kleiner wird. Ich weiß auch das die Indexe größer sind, und das es dann kracht. Nun ist aber, wie lautet der weg um das zu umgehen ^^ [/edit] |
AW: Löschen einer Generischen Liste
Was ich nicht verstehe: wozu erst eine zweite Liste anlegen, du kannst die ursprüngliche doch direkt verwenden, oder übersehe ich da etwas?
Delphi-Quellcode:
oder auch
for i := Liste.Count - 1 downto 0 do
if Bedingung(Liste[i]) then Liste.Delete(i);
Delphi-Quellcode:
i := 0;
while i < Liste.Count do begin if Bedingung(Liste[i]) then Liste.Delete(i) else inc(i); end; |
AW: Löschen einer Generischen Liste
okay,
vielleicht sollte ich noch ein wenig zum Result sagen. Das result ist eine eine Object list. In dessen Objekte sind auch noch Listen; und diese muss ich verlgeichen. sollte ich also daher einfach was in der For schleife rauslöschen, führt das zur sofortiger OutOfRange. Daher merke ich mir zuerst dessen Idexe, sollte dann ein Object, mit allen anderen vergliechen sind, dann lösch ich diese erst raus. Deswegen auch verschaltete schleifen... |
AW: Löschen einer Generischen Liste
Erstell dir doch einfach eine Kopie der Liste und entferne dann aus dieser Kopie einfach direkt alles, was du entfernen möchtest.
|
AW: Löschen einer Generischen Liste
das hat ich auch schon überlegt. Dachte es würde eine elegantere Methode geben.
Aber k. |
AW: Löschen einer Generischen Liste
Es geht doch um Doppler, oder? Dann könntest Du die Liste auch sortieren, (rückwärts) durchlaufen und das aktuelle Element mit seinem Vorgänger vergleichen und ggf.löschen.
|
AW: Löschen einer Generischen Liste
Irgendwie sehr verwirrend was du da schreibst.
Man kann mit Listen diverse Operationen durchführen. Eine der wichtigsten Operationen ist Filtern. Dieses Filtern kann man ![]() Oder man füllt eine 2. Liste mit den Elementen die der Filterbedingung entsprechen. Die Ursprungsliste bleibt dabei unverändert. Eine weitere Operation ist das Entfernen von Duplikaten. Auch diese Operation lässt sich in-place oder out-of-place durchführen. Dann gibt es auch noch Operationen mit 2 Listen. Eine Union (Vereinigungsmenge) vereinigt die Elemente in beiden Eingangslisten zu einer Ausgangsliste. Eine Intersection (Schnittmenge) kopiert nur die Elemente in die Ausgangsliste die in beiden Eingangslisten enthalten sind. Daneben gibt es noch das Complement in verschiedenen Ausführungen. (z.B. alle Elemente von Liste A die nicht in Liste B enthalten sind). Hast du nun eine oder zwei Eingangslisten? Willst du filtern, Duplikate entfernen oder Mengenoperationen durchführen? |
AW: Löschen einer Generischen Liste
Komisch, dass noch keiner gefragt hat, wie i initialisiert ist :)
Zur Fehlersuche wäre übrigens interessant gewesen, welchen Wert du in Delete reingegeben hast zu dem Zeitpunkt der Exception (Stichwort debug dcus) und Stoppunkt in die Zeile des raise). Deine Logik, den Index beim Löschen über -a anzupassen, ist vermutlich falsch. Du gehst davon aus, dass sie nach Index sortiert ist, denn nehmen wir an, in der Liste stehen 1 und 0, dann versucht er Index 1 und -1 (0 - a, und in a steht 1) zu löschen. |
AW: Löschen einer Generischen Liste
Zeit des Exection;
Index von der EkenebteZumLlschen Liste : 1 Wert hinter diesem index : 7 Länge der Liste result : 6. ich weiß ja wo der fehler herkommt. . . . :p aber auch ohne - a wird eine Exeption ausgelöst. Beim versuch ElementeZumLöschen.sort kommt eine mit der Meldung "Kein aktiver Solver!" dasd kann doch nicht so schwer item aus einer Liste zu löschen, welche eine IF bedinnung erfüllen. Werde es nun mal nur mit ner For schelfie schreiben, ist schlechter für Performance. Aber soviele Item´s sollte dies Liste nicht beinhalten. :o [EDIT] sortieren hat schon gereicht. Das PRoblem kommt aus ner anderen Unit. [/edit] |
AW: Löschen einer Generischen Liste
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 Uhr. |
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