Autor |
Beitrag |
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 07.07.08 19:34
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.  Was spricht dagegen, die verketteten Listen in TObjectLists zu verfrachten, bzw. was dafür ? Die Elementanzahl würde bei höchstens 100-1000 liegen. 
_________________ Gruß
Hansa
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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.
_________________ We are, we were and will not be.
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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.
_________________ Gruß
Hansa
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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.
_________________ We are, we were and will not be.
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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 ? 
_________________ Gruß
Hansa
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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 ?  |
Naja, welchen Vorteil hat denn die verkette Liste an dieser Stelle?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 07.07.08 20:45
Eben nichts. Das ist es ja.  Der Index nützt mir wohl nichts und ich muss die Liste, egal welche, so oder so sequentiell durchgehen.
_________________ Gruß
Hansa
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 07.07.08 21:04
Und was soll die zweite Liste machen ?  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 ? 
_________________ Gruß
Hansa
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 07.07.08 21:18
Moin!
Warum sollte eine Folge lückenlos sein müssen, um eine Binärsuche machen zu können?
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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 07.07.08 21:24
Wenn schon, dann bringe EINFACHES Quelltext-Beispiel. Es geht darum, die Programm - Logik einfacher zu machen.
_________________ Gruß
Hansa
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 07.07.08 23:30
Jaja, ist ja schon gut. Narses soll nur noch sagen, was er da meint. 
_________________ Gruß
Hansa
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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.
_________________ We are, we were and will not be.
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 09.07.08 19:25
Verdammt, ich bin mit der TObjectList immer noch am kämpfen.
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.
_________________ Gruß
Hansa
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 09.07.08 19:28
So müsste das gehen: Delphi-Quelltext 1:
| MeineKlassenVar := MeineListe[MeinIndex] as TMeineKlasse; |
_________________ We are, we were and will not be.
|
|
PeterPain
      
Beiträge: 83
|
Verfasst: 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 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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.  Das muss ich mir mal überlegen. Oder Du sagst, wie man gezielt nach Werten sucht (unabhängig vom Index).
_________________ Gruß
Hansa
|
|
PeterPain
      
Beiträge: 83
|
Verfasst: 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
|
|