Comparer recuperer Items Tlistview [Résolu]

Signaler
Messages postés
12
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
9 janvier 2015
-
Messages postés
12
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
9 janvier 2015
-
Bonjour,

Comment comparer et récupérer tous les Items identiques d'un Tlistview selon plusieurs critères.

Je m'explique voici ma Tlistview (jolie non)

/ Marques / Villes / Numéros / Intérêt /
1---------- -------- ------- ---------
2---------- -------- ------- ---------
3---------- -------- ------- ---------
Etc... j'en ais plus de 2000

Je veux donc comparer et récupérer toute les lignes « villes+ numéros+ intérêt » qui son identique et la « Marques » est differentes pour créer des groupes. et ensuite la même chose pour la ligne 2 et cela pour tous la Tlistview.

J'ai plus de 2000 lignes à comparer Je suis actuellement avec une double boucle (FOR) 4000 000 tours des (IF) c'est fonctionnel mais en 25 minutes. Et je compte le faire avec des listes plus grande.

Si vous avez une solution simple efficace et rapide.
Merci d'avance. Je ne dort plus.

4 réponses

Messages postés
263
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
28 avril 2021
13
Salut,
montre nous le code que tu utilises pour faire cette boucle...
Le séparateur est un espace ? Tu cherches à supprimer les doublons ? As tu regardé du coté des TStringList pour faire cette boucle ? Utilises tu des colonnes pour séparer marques, villes...dans ton ListView ou c'est simplement l'item avec un caption avec un séparateur ?
Je pense qu'avec le morceau de code il sera plus simple de t'aider.
@+
Messages postés
12
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
9 janvier 2015

Voila le petit bout de code (bonne lecture)


// pour le départ de la boucle r2 :=1; G :=0; m :=0;

tot := Form1.Listview4.Items.Count;

// départ boucle 1
for v1 := 0 to tot-1 do
begin

// départ boucle 2
for R1 := r2 to tot-1 do
begin
d := d + 1;

// conditions
if (Form1.ListView4.Items[r1].caption <> Form1.ListView4.Items[v1].caption)
and (Form1.ListView4.Items[r1].SubItems[0] = Form1.ListView4.Items[V1].SubItems[0])
and (Form1.ListView4.Items[r1].SubItems[1] = Form1.ListView4.Items[V1].SubItems[1])
and (Form1.ListView4.Items[r1].SubItems[2] = Form1.ListView4.Items[V1].SubItems[2])
and (Form1.ListView4.Items[v1].SubItems[3] = '0')

then begin

// Place un 1 sur l'items pour ne plus le reprendre
Form1.ListView4.Items[r1].SubItems[3] := '1';

// Un de trouvé création d'un groupe
if (g = 0) then begin
Group := Form1.ListView3.Groups.Add;
Group.Header := 'Nouveau Groupe';
Group.GroupID := m;


Items :=Form1.ListView3.Items.Add;
Items.GroupID := m;
Items.Caption := (Form1.Listview4.items[V1].Caption);
Items.SubItems.Add (Form1.ListView4.Items[V1].SubItems[1]);
Items.SubItems.Add (Form1.ListView4.Items[V1].SubItems[2]);
Items.SubItems.Add (Form1.ListView4.Items[V1].SubItems[3]);

// Mets g à 1 pour ne pas créer un nouveau groupe
g:=1;

//fin création du groupe
end;

// Place le 2emme l'items dans le groupe
Items :=Form1.ListView3.Items.Add;
Items.GroupID := m;
Items.Caption := (Form1.Listview4.items[r1].Caption));
Items.SubItems.Add (Form1.ListView4.Items[r1].SubItems[1]);
Items.SubItems.Add (Form1.ListView4.Items[R1].SubItems[2]);
Items.SubItems.Add (Form1.ListView4.Items[R1].SubItems[3]);

// fin conditions
end;

// fin boucle 2
end;

// préparation pour le prochain tours

// Prochain départ pour la boucle à r2 + 1
r2 := r2 + 1;
// numéro du prochain groupe
m := m + 1;
// prêt pour créer un nouveau groupe
g := 0;

end; // fin de la boucle 1 (enfin)
Messages postés
263
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
28 avril 2021
13
Salut,
Un petit bout de code qui supprime les doublons et met les marques dans le même groupe...Pas tester en profondeur, donc il y a peut-être des bugs...en vitesse sur une liste de 2000 items avec 3 SubItems je tournes à environ 34 ms et 111000 Cycles CPU.
var
ListItem : TListItem;
I : Integer;
J : Integer;
K : Integer;
SearchS : Boolean;
SearchG : Integer;
begin
for I := 0 to ListView4.Items.Count -1 do
begin
SearchS := False;
SearchG := -1;
for K := 0 to ListView3.Items.Count -1 do
begin
ListItem := ListView3.FindCaption(K, ListView4.Items[I].Caption, False, True, False);
if ListItem <> nil then
begin
SearchG := ListItem.GroupID;
for J := 0 to ListItem.SubItems.Count -1 do
begin
if ListItem.SubItems[J] = ListView4.Items[I].SubItems[J] then
begin
SearchS := True;
end
else
begin
SearchS := False;
Break;
end;
end;
if SearchS then
Break;
end;
end;
if not SearchS then
begin
if SearchG = -1 then
begin
ListView3.Groups.Add;
ListView3.Groups[ListView3.Groups.Count -1].Header := 'Groupe'+IntToStr(ListView3.Groups.Count -1);
SearchG := ListView3.Groups.Count -1;
end;
ListView3.Items.Add;
ListView3.Items[ListView3.Items.Count -1].GroupID := SearchG;
ListView3.Items[ListView3.Items.Count -1].Caption := ListView4.Items[I].Caption;
ListView3.Items[ListView3.Items.Count -1].SubItems.AddStrings(ListView4.Items[I].SubItems);
end;
end;
end;

@+
Messages postés
263
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
28 avril 2021
13
Oupsss, hier pas eu bien le temps de tester et le code est bidon et les perfs sont inexactes, et pas top :-( en faite j'ai fait un test rapide sans les groupes et un max de doublons etc..., et je m'apercois que les groupes c'est ce qui coute chers en perfs,l'utilisation de la ListView n'a pas l'air judicieuse avec les groupes, un test tout simple avec add de 500 groupes dans la ListView coute env 10 sec, je pense qu'il va falloir voir les choses autrements si c'est possible...
@+
Messages postés
263
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
28 avril 2021
13
Bon ben effectivement la création de group aie aie...
Dans le code au dessus un petit oublie il faut modifier comme ceci :
...
if SearchS then
Break;
end
else
Break;
...

Un essai que tu peux faire, si on supprime la création des group ben ca va mieux en perf...il faut supprime ceci :
if SearchG = -1 then
begin
ListView3.Groups.Add;
ListView3.Groups[ListView3.Groups.Count -1].Header := 'Groupe'+IntToStr(ListView3.Groups.Count -1);
SearchG := ListView3.Groups.Count -1;
end;

A toi de voir le chemin à prendre maintenant.
@+
Messages postés
12
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
9 janvier 2015

Merci pour les réponses, j'ai résolu le problème j'utilise un Grid.