Comparer deux listes d'objets [Résolu]

Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
- - Dernière réponse : MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
- 22 févr. 2006 à 16:40
Bonjour à tous,

J'ai deux ArrayList d'objet Personne avec nom,prenom,etc...

Et je voudrais comparer la premiere liste à la seconde.

Comment faire detecter si les deux sont identiques ou non sans faire deux boucle for imbriqué, c'est à dire je commence à lire la permiere personne de la permiere liste et je le compare avec toutes les autres personnes de la secondes listes etc... Si il y a 1000 personne, ca me fera 1000X1000 = 1 million de passage....

Par avance, merci.
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
40
3
Merci
Il faudrait savoir si tu aimerais qu'elles soient identiques au niveau du contenu global (les memes personnes mais pas forcément dans le meme ordre dans les 2 arraylist), ou si elles sont strictement identiques.

Si c'est le second cas, il suffit simplement de voir si l'element i de l'arraylist 1 est le memes que l'element i de l'arraylist 2. Donc pas de boucle imbriquée, simplement un passage de for()

Enfin deja, premiere chose a comparer: leur propriété Count. Si elle est différente, l'ArrayList ne sera pas identique.



Mx
MVP C#

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 189 internautes nous ont dit merci ce mois-ci

Commenter la réponse de MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
40
3
Merci
Si tu dois comparer plusieurs propriétés, je pense que tu ne vas pas avoir le choix...
Deja il faudra implementer l'interface IComparable a ta classe Personne, et y faire ton test de comparaison entre les objets.
Et ensuite, boucle for (ou foreach) imbriquées. Des que pour une occurence de ta boucle "englobante", tu ne trouves pas l'equivalent dans ta boucle "englobée", ca veut dire qu'il y a une différence, et tu sors de tes boucles (pour pas que cela ne continue pour rien)



Mx
MVP C#

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 189 internautes nous ont dit merci ce mois-ci

Commenter la réponse de MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
40
3
Merci
Petit essai rapide


<HR>

using System;

using System.Collections;

namespace ConsoleApplication1
{

class
Program
{

static
void Main(
string[] args)
{

ArrayList a1 =
new
ArrayList();

ArrayList a2 =
new
ArrayList();

a1.Add(
new
Personne(
"John",
"Doe"));
a1.Add(
new
Personne(
"Jane",
"Doe"));
a2.Add(
new
Personne(
"Jane",
"Doe"));
a2.Add(
new
Personne(
"John",
"Does"));

bool identique =
false;

for (
int i = 0; i < a1.Count; i++)
{

Personne p1 = (
Personne)a1[i];
identique =
false;

for (
int j = 0; j < a2.Count; j++)
{

object p2 = a2[j];

if (p1.CompareTo(p2) == 1)
{
identique =
true;

break;
}
}

if(!identique)
break;
}

Console.WriteLine(identique);

Console.ReadLine();
}
}


public
class
Personne :
IComparable
{

public
string Nom;

public
string Prenom;

public Personne(
string nom,
string prenom)
{

this.Nom = nom;

this.Prenom = prenom;
}

public
int CompareTo(
object p)
{

Personne temp = (
Personne)p;

if (
this.Prenom == temp.Prenom &&
this.Nom == temp.Nom)
return 1;

return 0;
}
}
}


<HR>

On a une classe personne, avec une méthode CompareTo qui recoit un object (casté en personne ensuite) en parametre, et qui renvoit 1 si les propriétés Nom et Prenom des personnes sont strictement identiques (a toi de voir pour les min/maj), 0 sinon.

Ensuite, eh bien ce sont 2 boucles imbriquées dans le Main, qui comparent les valeurs contenues dans les ArrayLists, et une variable booleen qui prend true quand 2 valeurs identiques sont trouvées, false autrement.
Quand le bool est a true, on continue jusqu'a qu'on ait vérifié toutes les valeurs d'un ArrayList, sinon, il a une différence, on sort de la boucle.

Verifie quand meme au prealable si tes listes ont le meme nombre d'elements avant d'entrer dans ces boucles.



Mx
MVP C#

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 189 internautes nous ont dit merci ce mois-ci

Commenter la réponse de MorpionMx
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
0
Merci
Ben en faite les listes font exactement la même taille mais c'est au niveau des propriétés (nom, prénom etc...) qu'il peut y avoir des différences. Sinon chaque objet personne possède une propriété Id qui sert à l'identifier . L'élement à l'index 0 de la liste 1 aura l'id 1 et l'élement à l'index 0 de la liste 2 aura l'index 1. C'est juste au niveau des propriété qu'il faudrait que je détecte les differences.

Exemple

Liste 1 | Liste 2

id : 1 / nom : jean id : 1 / nom : jeana
id : 2 / nom : claude id : 2 / nom : claude

ici les listes ne sont pas identiques a cause de jean et jeana
Commenter la réponse de cs_emmanuel9
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
0
Merci
J'ai déja utilisé cette fonction en faisant par exemple :

liste_frais.Sort(new ListeDateSorter(new Frais())) ;

Mais comment faire pour deux listes ?
Commenter la réponse de cs_emmanuel9
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
0
Merci
Ok, merci pour cette réponse si complète, je vais faire comme ca .
Commenter la réponse de cs_emmanuel9
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
40
0
Merci
Y'a pas de quoi



Mx
MVP C#
Commenter la réponse de MorpionMx