Comparer deux listes d'objets

Résolu
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 - 22 févr. 2006 à 13:39
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre 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.
A voir également:

7 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
22 févr. 2006 à 13:57
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#
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
22 févr. 2006 à 15:40
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#
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
22 févr. 2006 à 16:26
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#
3
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
22 févr. 2006 à 14:04
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
22 févr. 2006 à 15:58
J'ai déja utilisé cette fonction en faisant par exemple :

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

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



Mx
MVP C#
0
Rejoignez-nous