Comparer recuperer Items Tlistview [Résolu]

ralebole 14 Messages postés mardi 21 mars 2006Date d'inscription 9 janvier 2015 Dernière intervention - 7 oct. 2014 à 19:19 - Dernière réponse : ralebole 14 Messages postés mardi 21 mars 2006Date d'inscription 9 janvier 2015 Dernière intervention
- 9 janv. 2015 à 14:37
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.
Afficher la suite 

Votre réponse

6 réponses

cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 8 oct. 2014 à 08:05
0
Merci
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.
@+
Commenter la réponse de cs_yanb
ralebole 14 Messages postés mardi 21 mars 2006Date d'inscription 9 janvier 2015 Dernière intervention - 8 oct. 2014 à 14:09
0
Merci
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)
Commenter la réponse de ralebole
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 9 oct. 2014 à 15:32
0
Merci
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;

@+
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 10 oct. 2014 à 08: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...
@+
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - 10 oct. 2014 à 10:02
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.
@+
Commenter la réponse de cs_yanb
ralebole 14 Messages postés mardi 21 mars 2006Date d'inscription 9 janvier 2015 Dernière intervention - 9 janv. 2015 à 14:37
0
Merci
Merci pour les réponses, j'ai résolu le problème j'utilise un Grid.
Commenter la réponse de ralebole

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.