Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - TObjectList oder verkettete Liste ?
hansa - Mo 07.07.08 19:34
Titel: TObjectList oder verkettete Liste ?
Hi,
ich muss beim Programmstart eine Liste aufbauen, also aus DB lesen und diese während des Programmlaufes bereit halten. Was ist da jetzt besser ? Eine verkettete Liste oder eine TObjectList ? Die verkettete Liste funktioniert zwar, aber wenn jemand anderes da was ändern muss, dann blicken die nicht richtig durch. :mrgreen: Was spricht dagegen, die verketteten Listen in TObjectLists zu verfrachten, bzw. was dafür ? Die Elementanzahl würde bei höchstens 100-1000 liegen. :shock:
Gausi - Mo 07.07.08 20:13
Das kommt darauf an, was du mit der Liste machen willst.
Wenn die Liste nur einmalig erstellt wird und dann mehr oder weniger konstant bleibt, würde ich ein Array (also TObjectlist) vorziehen. Besonders dann, wenn man häufiger per Index auf ein Objekt zugreifen will und/oder die Liste sortiert ist und man häufiger nach einem Element suchen will (Binärsuche).
Verkettete Listen würde ich nur dann nehmen, wenn man häufig andere Objekte einfügen, löschen oder verschieben (nicht vertauschen) muss - dann ist das umbiegen der Zeiger effizienter als die Rumkopiererei im Array.
hansa - Mo 07.07.08 20:20
Die Liste wird konstant bleiben. Ich vermisse allerdings bei der TObjectlist Next, First etc. Beide Listen müssten sequenziell durchgewandert werden. Sortiert sind die Listen sowieso. ORDER BY etc. Bei der TObjectList ist das .Add aber einfacher zu verstehen, als das Einfügen der Knoten in die verkettete Liste. Der logische Vorteil geht IMHO aber wohl flöten, sofern ein Element lokalisiert werden muss.
Gausi - Mo 07.07.08 20:27
Naja, anstelle des NEXT hat man ja den indizierten Zugriff auf einzelne Objekte. [0] ist das erste, [Count-1] das letzte, [i+1] das nach dem [i] usw. Das hat dann auch den Vorteil, dass man in einer sortierten Objectlist nicht sequentiell suchen muss, sondern mit Binärsuche nach Log(n) vielen Schritten fertig ist.
hansa - Mo 07.07.08 20:35
Tja, die Liste ist zwar sortiert, aber eben doch nicht. So ungefähr :
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| 1 1,00 2 33,00 3 2,00 5 7,77 8 3,00 9 20,00 |
Erste Splate ist sortiert, die zweite nicht. Was wäre jetzt mit dem Wert 4 ? Das gibts ja nicht. Aber was nützt mir da jetzt der Index ? Bzw. gar ein Baum ? :shock:
Narses - Mo 07.07.08 20:38
Moin!
hansa hat folgendes geschrieben: |
Erste Splate ist sortiert, die zweite nicht. Was wäre jetzt mit dem Wert 4 ? Das gibts ja nicht. Aber was nützt mir da jetzt der Index ? Bzw. gar ein Baum ? :shock: |
Naja, welchen Vorteil hat denn die verkette Liste an dieser Stelle? :nixweiss: ;)
cu
Narses
hansa - Mo 07.07.08 20:45
Eben nichts. Das ist es ja. :mrgreen: Der Index nützt mir wohl nichts und ich muss die Liste, egal welche, so oder so sequentiell durchgehen.
Narses - Mo 07.07.08 20:52
Moin!
hansa hat folgendes geschrieben: |
Der Index nützt mir wohl nichts und ich muss die Liste, egal welche, so oder so sequentiell durchgehen. |
Du kannst aber eine zweite TObjectList anlegen (mit .OwnsObjects=FALSE) und diese nach dem anderen Kriterium sortiert halten, dann nutzt die der Index was. :idea: ;)
cu
Narses
hansa - Mo 07.07.08 21:04
Und was soll die zweite Liste machen ? :gruebel: Siehe obiges Beispiel. Einer gibt 4 ein und den Wert gibt es nicht. Ich fange also bei 1,2,3 an und dann kommt die 5 und ist > 4 => 4 nicht da, also sequentiell durchsuchen und Endebedingung daraus ableiten. Wie soll denn das sonst gehen ? :shock:
Narses - Mo 07.07.08 21:18
Moin!
Warum sollte eine Folge lückenlos sein müssen, um eine Binärsuche machen zu können? :gruebel:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| 1 2 3 5 7 9
Gesucht: 4
1 2 3 5 7 9 ....^......
1 2 3 5 7 9 ..^..
1 2 3 5 7 9 ^ |
Oder hab ich was übersehen? :?
cu
Narses
hansa - Mo 07.07.08 21:24
Wenn schon, dann bringe EINFACHES Quelltext-Beispiel. Es geht darum, die Programm - Logik einfacher zu machen.
Delete - Mo 07.07.08 22:38
denke für dein beispiel ist 'ne tObjectList das beste. da sich die liste selbst um die speicherverwaltung kümmert :-)
das durchlaufen geht einfach mit for ... entweder mit for i := 0 to list.count -1 do something(list.index[i]) oder mit for x in list do something(x)
sollte doch einfach genug sein ... und den ganzen admin schrott nimmt dir die VCL ab :-)
hansa - Mo 07.07.08 23:30
Jaja, ist ja schon gut. Narses soll nur noch sagen, was er da meint. 8)
Gausi - Di 08.07.08 08:13
Was Narses meint, ist Binärsuche, wovon auch ich schon im ersten Posting gesprochen habe. Damit kann man schneller feststellen, ob ein Element in einem Arra enthalten ist oder nicht. Wenn das Array z.B. 1000 Elemente enthält, dann muss man nicht 1000 Vergleiche durchführen, sondern nur 10 oder 11 um festzustellen, ob die 4 vorkommt (und wenn ja, wo) oder nicht.
hansa - Mi 09.07.08 19:25
Verdammt, ich bin mit der TObjectList immer noch am kämpfen. :mrgreen:
Eine Testliste ist erstellt und hat 76 Elemente. Zumindest sagt das Count. Wieso komme ich aber nicht an die einzelnen Elemente dran ? Hat einer ein konkretes Beispiel ? Vermutlich ist das lediglich eine falsche Syntax.
Gausi - Mi 09.07.08 19:28
So müsste das gehen:
Delphi-Quelltext
1:
| MeineKlassenVar := MeineListe[MeinIndex] as TMeineKlasse; |
PeterPain - Mi 09.07.08 19:39
Oder ganz elegant ne eigene klasse ableiten, etwa so
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| TMyClass = class
end;
TMyObjectList = class(TObjectList) private function GetItem(index: integer): TMyClass; public property Items[index: integer]: TMyClass read GetItem; default; end;
function TMyObjectList.GetItem(index: integer): TMyClass; begin Result := TMyClass(inherited Items[index]); end; |
da kannst du dann auch ohne weiteres weitere Methoden einbauen, wie das sortieren, binäres suchen, etc.
gruss
hansa - Mi 09.07.08 19:43
Ah, auf Gausi ist Verlass.
Aber ist schon erledigt. Source allerdings zu komplex, um die Lösung zu posten. War Klammer () bzw. as usw. Problem.
@gelber Kasten : Peter, Du machst mir echt Pain. :mrgreen: Das muss ich mir mal überlegen. Oder Du sagst, wie man gezielt nach Werten sucht (unabhängig vom Index).
PeterPain - Mi 09.07.08 20:31
Suchen kann man dann so(wenn die liste sortiert ist, das einfachste ist es da, vom sortieren abzusehen und die neuen elemente gleich an der richtigen stelle einzufügen)
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:
| function TMyObjectList.BinarySearch(S : String; L, R : integer; var Ind : integer) : Boolean; begin Result := false; if Count = 0 then ind := 0 else repeat Ind := (L + R) div 2; if L > R then begin while (ind < Count) and (ind >= 0) and (GetItem(ind).FileHash < S) do Inc(Ind); break; end else begin if S > GetItem(ind).FileHash then L := Ind + 1 else if s < GetItem(ind).FileHash then R := Ind - 1 else begin Result := True; end; end; until Result; end; |
in dem beispiel hatte ich nach filehash sortiert, und auch gesucht, dass kann man ja beliebig anpassen ;)
gruss
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!