Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 06.07.05 20:14 
Hallo!
Wie kann man möglichst schnell jedes Items einer ListBox mit allen anderen vergleichen? Bei 9000 Items dauert das ganz schön lange...

Gibt's eine Möglichkeit, wie es schneller geht?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mi 06.07.05 23:43 
Was willst du den vergleichen? Ich könnte mir vorstellen, dass der Zugriff auf den String ListBox.Items.Text schneller ist, wenn du genau weisst, was du machen willst und selbst auf die Zeilenumbrüche prüfst.

Gruß,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
freedy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: Do 07.07.05 13:11 
Leg dir doch einfach eine Kopie der Items an und schreib einen Algorithmus, der aus der Kopie alle bereits verglichenen entfernt. Dadurch sollte sich deine zu vergleichende Menge verkleinern. Wäre vielleicht schon mal ein Geschwindigkeitsvorteil.

Trotzdem habe ich dein Problem noch nicht ganz verstanden.

freedy
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 07.07.05 18:17 
Danke erstmal für eure Antworten!

user profile iconmaxk hat folgendes geschrieben:
Was willst du den vergleichen?


user profile iconfreedy hat folgendes geschrieben:
Leg dir doch einfach eine Kopie der Items an und schreib einen Algorithmus, der aus der Kopie alle bereits verglichenen entfernt. Dadurch sollte sich deine zu vergleichende Menge verkleinern. Wäre vielleicht schon mal ein Geschwindigkeitsvorteil.

Trotzdem habe ich dein Problem noch nicht ganz verstanden.


@maxk: Jedes Items mit allen anderen, d.h., bei maximal 9999 Items muss ich JEDES der 9999 Items genau 9998x vergleichen - 9998x deswegen, weil das Items selbst wegfällt, da es sich sonst mit sich selbst vergleicht. Das dauert! Ich habe zwar eine ProgressBar und Labels, die den Fortschritt anzeigen, aber es dauert eben!

@freedy: Ich kann alle bereits verglichenen Items nicht entfernen, da ich sie für die nachfolgenden Vergleiche noch brauche - bei jedem Item beginnt der Vergleich bei Items[0], durchläuft dann alle weiteren Items, überspringt sich selbst und endet bei Items[Items.Count-1].

Erschwerend kommt noch hinzu, dass in Wirklichkeit jeweils Items von 2 ListBox's verglichen werden müssen: ListBox2 und ListBox3, beide haben exakt die gleiche Anzahl an Items. Der Code steckt voller Anweisungen, die speziell für das Programm benötigt werden, würde also eher verwirren als erklären! Zum besseren Verständnis hier mal das Prinzip:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
_I := 0;
I := 0;
ListBox7.Clear;

while _I < MaxCount do  {MaxCount ist die Anzahl an Items, also Items.Count-1}
 for I := 0 to MaxCount do
 begin
  if I <> _I then  {Wenn das Item[I] <> _I ist, sonst würde es mit sich selbst verglichen}
   if (ListBox2.Items[_I] = ListBox2.Items[I]) and
      (ListBox3.Items[_I] = ListBox3.Items[I]) then
   begin  {In ListBox7 werden die identen Items gesammelt}
    ListBox7.Items.Add(IntToStr(I+1)+'    '+ListBox2.Items[I]);
    //...
   end;
  //...
 end;


Klappt ja bestens, aber ist eben so langsam. Geht das nicht schneller?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 07.07.05 18:35 
Wenn die Reihenfolge egal ist, dann sortiert doch die beiden Listen erstmal, dann stehen die Identischen untereinander und du kannst sie leichter finden.

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
freedy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: Do 07.07.05 18:45 
Sortieren ist wirklich keine schlechte Idee.

Ideen habe ich sonst auch keine... Wie lange dauert die Routine denn bei dir? Kannst du sie vielleicht in einen Thread packen und im Hintergrund laufen lassen?

freedy
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 08.07.05 18:31 
user profile iconmaxk hat folgendes geschrieben:
Wenn die Reihenfolge egal ist, dann sortiert doch die beiden Listen erstmal, dann stehen die Identischen untereinander und du kannst sie leichter finden.

Hab' ich soweit. Ich habe aber keine Ahnung, wie ich die anderen Items, also die, die mit keinem anderen Item ident sind, weglasse. Es sollen nur identische in der ListBox enthalten sein. Wie kann ich die anderen löschen, wie erkennt sie mein Programm?

user profile iconfreedy hat folgendes geschrieben:
Wie lange dauert die Routine denn bei dir?freedy

Bei 1500 Items ca. 4 Minuten.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Sa 09.07.05 12:08 
Durch die Sortierung wäre es möglich, dass das erste Item (ListBox1) nichtmehr zu dem erstem Item (ListBox2) passt. Also fällt das wohl raus. Warum hast du eine solche Zuordnung überhaupt drin? Wäre es nicht einfacher in eine Listbox alles reinzupacken, jedem Item ein Objekt zuzuordnen und die anderen Listboxen nurnoch zur Darstellung zu verwenden. Wenn dein Code nurnoch von einer Listbox abhänig wäre, könnte man dort auch optimieren, aber so bin ich mit meinem Latein (?) am Ende - Sry.

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 09.07.05 12:54 
Danke euch für eure Hilfe!

Das Ganze ist ein Karteikasten. ListBox1 enthät die Stichworte, ListBox2 den Text. Ich hab' das Problem jetzt so gelöst, dass ich von Items[Items.Count-1] to 0 prüfe, ob das jeweils vorherige Item ident mit dem aktuellen ist. Da die Items aber als erstes "Wort" ein Zahl haben, musste ich diese erstmal ans Ende des Items bringen. Dann kann ich in eine TStringList sortieren, und weil diese Sorted := True ist, fallen schonmal doppelte Items weg. Zum Schluss noch die Zahlen wieder nach vorne bringen und das ist es dann endlich!

Kompliziert, aber jetzt geht's in Sekunden!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!