Autor Beitrag
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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. :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:

_________________
Gruß
Hansa
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 07.07.08 20:35 
Tja, die Liste ist zwar sortiert, aber eben doch nicht. So ungefähr :

ausblenden 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:

_________________
Gruß
Hansa
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 07.07.08 20:38 
Moin!

user profile iconhansa 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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.

_________________
Gruß
Hansa
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 07.07.08 20:52 
Moin!

user profile iconhansa 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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:

_________________
Gruß
Hansa
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 07.07.08 23:30 
Jaja, ist ja schon gut. Narses soll nur noch sagen, was er da meint. 8)

_________________
Gruß
Hansa
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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.

_________________
Gruß
Hansa
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 09.07.08 19:28 
So müsste das gehen:
ausblenden Delphi-Quelltext
1:
MeineKlassenVar := MeineListe[MeinIndex] as TMeineKlasse;					

_________________
We are, we were and will not be.
PeterPain
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83



BeitragVerfasst: Mi 09.07.08 19:39 
Oder ganz elegant ne eigene klasse ableiten, etwa so

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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).

_________________
Gruß
Hansa
PeterPain
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83



BeitragVerfasst: 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)

ausblenden 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;
//in Ind wird die position die das item haben sollte (falls es neu ist) angegeben, falls es nicht neu ist
//wird hier der Index des existierenden Objektes angegeben
//result ist true, wenn schon ein Objekt mit dem gleichen FileHash existiert
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 >= 0and (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