IFT 1179 : Programmation en C# Classe ArrayList
Transcription
IFT 1179 : Programmation en C# Classe ArrayList
IFT 1179 : Programmation en C# Classe ArrayList (suite) : Une partie de ce résumé vient du lien de Microsoft : http://msdn.microsoft.com/library/fre/default.asp?ur l=/library/FRE/cpref/html/frlrfsystemcollectionsarra ylistclasstopic.asp L’espace de nom (namespace) System.Collections contient plusieurs classes dont ArrayList (liste tableau), Stack (pile), SortedList (liste triée), ... La classe ArrayList implémente l'interface IList à l'aide d'un tableau dont la taille augmente dynamiquement selon les besoins. Constructeurs : public ArrayList(); Initialise une nouvelle instance de la classe ArrayList qui est vide et possède la capacité initiale par défaut (16) Exemple : ArrayList divi100 = new ArrayList() ; public ArrayList(int); Initialise une nouvelle instance de la classe ArrayList qui est vide et a la capacité initiale spécifiée. Exemple : ArrayList stat = new ArrayList(65) ; // pour 65 stations de metro au maximum Quelques propriétés : Capacity représente le nombre d'éléments que ArrayList est capable de stocker. Count représente le nombre réel d'éléments stockés dans ArrayList. Capacity est toujours supérieur ou égal à Count. Si Count excède Capacity lors de l'ajout d'éléments, la capacité de la liste est doublée en réallouant automatiquement le tableau interne. Quand la valeur de Capacity est explicitement définie, le tableau interne est aussi réalloué pour prendre en compte la capacité spécifiée. Si la valeur zéro est explicitement définie pour Capacity, le Common Language Runtime lui attribue plutôt la capacité par défaut. La capacité par défaut est 16. IFT 1179 : automne 2005 Classe ArrayList 150 On parcourt une liste (tableau) dans deux sens : for (int i = 0 ; i < liste.Count ; i++) . . . OU for (int i = liste.Count -1 ; i >= 0; i--) . . . Quelques méthodes 1) Pour ajouter un nouvel élément à la liste : p u b l i c v i r t u a l int A d d ( object value ) ; Ajoute un objet à la fin de ArrayList. p u b l i c v i r t u a l void I n s e r t ( int index, object value ) ; Insère un élément dans ArrayList à l'index spécifié. 2) Pour supprimer un élément de la liste : p u b l i c v i r t u a l void R e m o v e ( object obj ) ; Cette méthode effectue une recherche linéaire ; par conséquent, la durée d'exécution moyenne est proportionnelle à Count. Autrement dit, cette méthode est une opération O(n), où n correspond à Count. Cette méthode détermine l'égalité en appelant Object.Equals. Dans des collections d'éléments contigus, telles que des listes, les éléments qui suivent l'élément supprimé remontent pour occuper la position libérée. Si la collection est indexée, les index des éléments déplacés sont également mis à jour. Ce comportement ne s'applique pas aux collections dont les éléments sont regroupés de manière conceptuelle en compartiments, par exemple, les tables de hachage. p u b l i c v i r t u a l void R e m o v e A t ( int index ) ; Dans des collections d'éléments contigus, telles que des listes, les éléments qui suivent l'élément supprimé remontent pour occuper la position libérée. Si la collection est indexée, les index des éléments déplacés sont également mis à jour. Ce comportement ne s'applique pas aux collections dont les éléments sont regroupés de manière conceptuelle en compartiments, par exemple, les tables de hachage. IFT 1179 : automne 2005 Classe ArrayList 151 3) Recherche d’un élément de la liste : p u b l i c v i r t u a l int I n d e x O f ( object value ) ; Dans ArrayList, la recherche est effectuée vers le bas, en commençant au premier élément et jusqu'au dernier. Cette méthode effectue une recherche linéaire ; par conséquent, la durée d'exécution moyenne est proportionnelle à Count. Autrement dit, cette méthode est une opération O(n), où n correspond à Count. Cette méthode détermine l'égalité en appelant Object.Equals. p u b l i c v i r t u a l int L a s t I n d e x O f ( object value ) ; Dans ArrayList, la recherche est effectuée vers le haut, en commençant au dernier élément et jusqu'au premier. Cette méthode effectue une recherche linéaire ; par conséquent, la durée d'exécution moyenne est proportionnelle à Count. Autrement dit, cette méthode est une opération O(n), où n correspond à Count. p u b l i c v i r t u a l bool C o n t a i n s ( object item ) ; Cette méthode effectue une recherche linéaire ; par conséquent, la durée d'exécution moyenne est proportionnelle à Count. Autrement dit, cette méthode est une opération O(n), où n correspond à Count. Cette méthode détermine l'égalité en appelant Object.Equals. p u b l i c v i r t u a l int B i n a r y S e a r c h ( object value ) ; Le paramètre value ainsi que chaque élément de ArrayList doivent implémenter l'interface IComparable utilisée pour les comparaisons. Si ArrayList n'est pas déjà trié selon l'implémentation IComparable, le résultat peut être incorrect. La comparaison d' une référence null (Nothing dans Visual Basic) avec n'importe quel type est autorisée et ne génère pas d'exception lors de l'utilisation de IComparable. Lors du tri, une référence null (Nothing) est considérée comme étant inférieure à n'importe quel autre objet. IFT 1179 : automne 2005 Classe ArrayList 152 Si ArrayList contient plusieurs éléments possédant la même valeur, la méthode ne retourne qu'une des occurrences (n'importe laquelle, pas nécessairement la première). Si ArrayList ne contient pas la valeur spécifiée, la méthode retourne un entier négatif. Vous pouvez appliquer l'opération de bits complémentaire (~) à cet entier négatif afin d'obtenir l'index du premier élément supérieur à la valeur de recherche. Lors de l'insertion de la valeur dans ArrayList, cet index devrait être utilisé comme point d'insertion pour conserver l'ordre de tri. Cette méthode est une opération O(log2 n), où n est le nombre d'éléments compris dans la plage. p u b l i c v i r t u a l int B i n a r y S e a r c h ( object value, IComparer comparer ); 4) Tri d’une liste : p u b l i c v i r t u a l void S o r t ( ) ; Cette méthode utilise Array.Sort, qui se sert de l'algorithme QuickSort. Il s'agit d'une opération O(n ^2), où n correspond au nombre d'éléments à trier, avec une moyenne de (thêta)(n log n). p u b l i c v i r t u a l void S o r t ( IComparer comparer ) ; 5) etc . . . /* * * * * * * * * * * * * * * * * * * Fichier List2.cs (ArrayList des personnes) Objectifs : ArrayList, ajout, insertion, tri, recherche, réflexions Exercices : 1. trier + afficher selon les tailles utilisant Sort dans le même programme 2. autres manières de supprimer TOUS à partir de quelques noms (réflexions + révision) (à parler en classe aujourd'hui pour la révision) 30 points seront posés au final sur cet exemple Examens finals : Choix 1 : ce samedi de 10:00 à 13:00 au Z-310 (veuillez m'écrire au plus tard jeudi le 1er décembre avant 15:00 pour préparer la polycopie des énoncés). Choix 2 : mercredi 14 décembre de 18:30 à 21:30 IFT 1179 : automne 2005 Classe ArrayList 153 * Mercredi le 07 décembre : * Z-310 * 18:30 -> 19:xx * Youssef Zine présentera deux applications Windows * 19:xx -> * Consultation + révision + ... avec Yasser */ using System; using System.IO; using System.Collections; class Personne : IComparable { private string nomPre; private char sexe; private double taille, poids; private int numero; public static int codeTri; public Personne(string nomPre, char sexe,double taille, poids,int numero) { this.nomPre = nomPre.ToUpper(); this.numero = numero; this.sexe = sexe; this.taille = taille; this.poids = poids; } double public override string ToString() { return string.Format("{0, 30:S} {1, 5:D} {2, 7:F2} {3, 8:F1} {4, 15:S}", nomPre, numero, taille, poids, (sexe == 'F' ? "feminin":"masculin")); } public int CompareTo(object obj) { Personne autre = (Personne) obj; return nomPre.CompareTo(autre.nomPre) ; } } class List2 { static ArrayList LireRemplir(string nomFichier, int borne) { ArrayList liste = new ArrayList (borne); Console.WriteLine("La capacite de cette liste au debut : " + liste.Capacity); StreamReader aLire = File.OpenText(nomFichier); string ligneLue = null; while ( (ligneLue = aLire.ReadLine()) != null) IFT 1179 : automne 2005 Classe ArrayList 154 { string nom = ligneLue.Substring(0, 30); char sexe = ligneLue[30]; double taille = double.Parse(ligneLue.Substring(36, 8)); double poids = double.Parse(ligneLue.Substring(50, 8)); int num = int.Parse(ligneLue.Substring(60)); // ajouter une personne à la liste liste.Add ( new Personne(nom, sexe, taille, poids, num) ); } aLire.Close(); return liste; } static void Afficher(ArrayList pers, string mess) { Console.WriteLine("Contenu de la liste des personnes " + mess + ":\n"); for(int i = 0; i < pers.Count; i++) Console.WriteLine("{0,3}) {1}", i, pers[i]); Console.WriteLine(); } static void SupprimerTOUS(ArrayList pers, string nomRecherche) { nomRecherche = nomRecherche.ToUpper(); for (int i = nomRecherche.Length ; i < 30; i++) nomRecherche += " "; Personne aChercher = new Personne(nomRecherche, ' ', 0.0, 0.0, 0); int indice = 123456, rang = 0; while (indice >= 0) { indice = pers.BinarySearch(aChercher); if (indice >= 0) { Console.WriteLine("{0, 2:D}) {1}", ++rang, pers[indice]); pers.RemoveAt(indice); } } if (rang > 0) Console.WriteLine("On a supprime {0} personne(s)" , rang); else Console.WriteLine("On ne trouve pas " + aChercher); Console.WriteLine(); IFT 1179 : automne 2005 Classe ArrayList 155 } static void Inserer(ArrayList pers, string nom, char sexe, double taille, double poids, int numero) { nom = nom.ToUpper(); for (int i = nom.Length ; i < 30; i++) nom += " "; Personne aAjouter = new Personne(nom, sexe, taille, poids, numero); int indice = pers.BinarySearch(aAjouter); if (indice < 0) indice = (-indice) - 1 ; pers.Insert(indice, aAjouter); } static void Main(string[] args) { const int MAX_PERS = 20; // au maximum 20 personnes ArrayList pers = LireRemplir("R:\\Met_A05.txt", MAX_PERS); Afficher(pers, "avant le tri"); pers.Sort(); // trier la liste des personnes Afficher(pers, "apres le tri (avec CompareTo)"); Inserer(pers, "Tremblay Pierre", 'M', 1.66, 76.5, 4321); Inserer(pers, "Arcand Denys", 'M', 2.05, 97.5, 3333); Inserer(pers, "Robitaille Suzanne", 'F', 1.68, 64.5, 2244); Inserer(pers, "Vaucher Lise", 'F', 1.75, 70.1, 5511); Afficher(pers, "apres l'insertion de ces quatre personnes"); SupprimerTOUS(pers, "ROY CHANTAL"); SupprimerTOUS(pers, "Robitaille Suzanne"); SupprimerTOUS(pers, "Baba Ali"); Afficher(pers, "apres ces suppressions"); } } /* Exécution: La capacite de cette liste au debut : 20 Contenu de la liste des personnes avant le tri: 0) ROY CHANTAL feminin 1) MOLAISON CLAUDE masculin IFT 1179 : automne 2005 Classe ArrayList 2754 1,63 54,9 1848 1,57 62,2 156 2) BEDARD MARC-ANDRE masculin 3) ROBITAILLE SUZANNE feminin 4) MONAST STEPHANE masculin 5) JALBERT LYNE feminin 6) DUBE FRANCOISE feminin 7) ROBITAILLE SUZANNE feminin 8) LABELLE LISE feminin 9) RIVERIN HELENE feminin 10) MICHAUD NORMAND masculin 11) RICHER AGATHE feminin 12) BEGIN MARIE-LUCE feminin 13) ROBITAILLE SUZANNE feminin 14) DUMITRU PIERRE masculin 15) FILLION ERIC masculin 16) DESMARAIS DENISE feminin 17) TREMBLAY MARC masculin 18) TREMBLAY SYLVAIN masculin 2636 1,43 80,5 4119 1,58 60,2 1750 1,65 61,7 2168 1,63 52,6 4612 1,68 67,5 2325 1,72 65,4 1512 1,79 68,0 2340 1,71 60,8 3428 1,73 103,7 3563 1,65 53,1 4101 1,62 49,0 4371 1,48 61,5 3629 1,92 99,4 2630 1,78 75,7 3215 1,75 58,7 3529 1,79 64,9 1538 1,83 86,2 Contenu de la liste des personnes apres le tri (avec CompareTo): 0) BEDARD MARC-ANDRE masculin 1) BEGIN MARIE-LUCE feminin 2) DESMARAIS DENISE feminin 3) DUBE FRANCOISE feminin 4) DUMITRU PIERRE masculin 5) FILLION ERIC masculin 6) JALBERT LYNE feminin 7) LABELLE LISE feminin 8) MICHAUD NORMAND masculin 9) MOLAISON CLAUDE masculin IFT 1179 : automne 2005 Classe ArrayList 2636 1,43 80,5 4101 1,62 49,0 3215 1,75 58,7 4612 1,68 67,5 3629 1,92 99,4 2630 1,78 75,7 2168 1,63 52,6 1512 1,79 68,0 3428 1,73 103,7 1848 1,57 62,2 157 10) MONAST STEPHANE masculin 11) RICHER AGATHE feminin 12) RIVERIN HELENE feminin 13) ROBITAILLE SUZANNE feminin 14) ROBITAILLE SUZANNE feminin 15) ROBITAILLE SUZANNE feminin 16) ROY CHANTAL feminin 17) TREMBLAY MARC masculin 18) TREMBLAY SYLVAIN masculin 1750 1,65 61,7 3563 1,65 53,1 2340 1,71 60,8 4119 1,58 60,2 2325 1,72 65,4 4371 1,48 61,5 2754 1,63 54,9 3529 1,79 64,9 1538 1,83 86,2 Contenu de la liste des personnes apres l'insertion de ces quatre personnes: 0) ARCAND DENYS masculin 1) BEDARD MARC-ANDRE masculin 2) BEGIN MARIE-LUCE feminin 3) DESMARAIS DENISE feminin 4) DUBE FRANCOISE feminin 5) DUMITRU PIERRE masculin 6) FILLION ERIC masculin 7) JALBERT LYNE feminin 8) LABELLE LISE feminin 9) MICHAUD NORMAND masculin 10) MOLAISON CLAUDE masculin 11) MONAST STEPHANE masculin 12) RICHER AGATHE feminin 13) RIVERIN HELENE feminin 14) ROBITAILLE SUZANNE feminin 15) ROBITAILLE SUZANNE feminin 16) ROBITAILLE SUZANNE feminin IFT 1179 : automne 2005 Classe ArrayList 3333 2,05 97,5 2636 1,43 80,5 4101 1,62 49,0 3215 1,75 58,7 4612 1,68 67,5 3629 1,92 99,4 2630 1,78 75,7 2168 1,63 52,6 1512 1,79 68,0 3428 1,73 103,7 1848 1,57 62,2 1750 1,65 61,7 3563 1,65 53,1 2340 1,71 60,8 4119 1,58 60,2 2244 1,68 64,5 2325 1,72 65,4 158 17) ROBITAILLE SUZANNE feminin 18) ROY CHANTAL feminin 19) TREMBLAY MARC masculin 20) TREMBLAY PIERRE masculin 21) TREMBLAY SYLVAIN masculin 22) VAUCHER LISE feminin 4371 1,48 61,5 2754 1,63 54,9 3529 1,79 64,9 4321 1,66 76,5 1538 1,83 86,2 5511 1,75 70,1 1) ROY CHANTAL feminin On a supprime 1 personne(s) 2754 1,63 54,9 1) ROBITAILLE SUZANNE feminin 2) ROBITAILLE SUZANNE feminin 3) ROBITAILLE SUZANNE feminin 4) ROBITAILLE SUZANNE feminin On a supprime 4 personne(s) 2325 1,72 65,4 2244 1,68 64,5 4119 1,58 60,2 4371 1,48 61,5 On ne trouve pas BABA ALI ma sculin 0 0,00 0,0 Contenu de la liste des personnes apres ces suppressions: 0) ARCAND DENYS masculin 1) BEDARD MARC-ANDRE masculin 2) BEGIN MARIE-LUCE feminin 3) DESMARAIS DENISE feminin 4) DUBE FRANCOISE feminin 5) DUMITRU PIERRE masculin 6) FILLION ERIC masculin 7) JALBERT LYNE feminin 8) LABELLE LISE feminin 9) MICHAUD NORMAND masculin 10) MOLAISON CLAUDE masculin 11) MONAST STEPHANE masculin IFT 1179 : automne 2005 Classe ArrayList 3333 2,05 97,5 2636 1,43 80,5 4101 1,62 49,0 3215 1,75 58,7 4612 1,68 67,5 3629 1,92 99,4 2630 1,78 75,7 2168 1,63 52,6 1512 1,79 68,0 3428 1,73 103,7 1848 1,57 62,2 1750 1,65 61,7 159 12) RICHER AGATHE feminin 13) RIVERIN HELENE feminin 14) TREMBLAY MARC masculin 15) TREMBLAY PIERRE masculin 16) TREMBLAY SYLVAIN masculin 17) VAUCHER LISE feminin 3563 1,65 53,1 2340 1,71 60,8 3529 1,79 64,9 4321 1,66 76,5 1538 1,83 86,2 5511 1,75 70,1 Press any key to continue */ IFT 1179 : automne 2005 Classe ArrayList 160