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.
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.
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.
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 *
* 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, double poids,int numero)
{
this.nomPre = nomPre.ToUpper();
this.numero = numero;
this.sexe = sexe;
this.taille = taille;
this.poids = poids;
}
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)
{
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();
}
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 2754 1,63 54,9 feminin
1) MOLAISON CLAUDE 1848 1,57 62,2 masculin
2) BEDARD MARC-ANDRE 2636 1,43 80,5 masculin
3) ROBITAILLE SUZANNE 4119 1,58 60,2 feminin
4) MONAST STEPHANE 1750 1,65 61,7 masculin
5) JALBERT LYNE 2168 1,63 52,6 feminin
6) DUBE FRANCOISE 4612 1,68 67,5 feminin
7) ROBITAILLE SUZANNE 2325 1,72 65,4 feminin
8) LABELLE LISE 1512 1,79 68,0 feminin
9) RIVERIN HELENE 2340 1,71 60,8 feminin
10) MICHAUD NORMAND 3428 1,73 103,7 masculin
11) RICHER AGATHE 3563 1,65 53,1 feminin
12) BEGIN MARIE-LUCE 4101 1,62 49,0 feminin
13) ROBITAILLE SUZANNE 4371 1,48 61,5 feminin
14) DUMITRU PIERRE 3629 1,92 99,4 masculin
15) FILLION ERIC 2630 1,78 75,7 masculin
16) DESMARAIS DENISE 3215 1,75 58,7 feminin
17) TREMBLAY MARC 3529 1,79 64,9 masculin
18) TREMBLAY SYLVAIN 1538 1,83 86,2 masculin
Contenu de la liste des personnes apres le tri (avec CompareTo):
0) BEDARD MARC-ANDRE 2636 1,43 80,5 masculin
1) BEGIN MARIE-LUCE 4101 1,62 49,0 feminin
2) DESMARAIS DENISE 3215 1,75 58,7 feminin
3) DUBE FRANCOISE 4612 1,68 67,5 feminin
4) DUMITRU PIERRE 3629 1,92 99,4 masculin
5) FILLION ERIC 2630 1,78 75,7 masculin
6) JALBERT LYNE 2168 1,63 52,6 feminin
7) LABELLE LISE 1512 1,79 68,0 feminin
8) MICHAUD NORMAND 3428 1,73 103,7 masculin
9) MOLAISON CLAUDE 1848 1,57 62,2 masculin
10) MONAST STEPHANE 1750 1,65 61,7 masculin
11) RICHER AGATHE 3563 1,65 53,1 feminin
12) RIVERIN HELENE 2340 1,71 60,8 feminin
13) ROBITAILLE SUZANNE 4119 1,58 60,2 feminin
14) ROBITAILLE SUZANNE 2325 1,72 65,4 feminin
15) ROBITAILLE SUZANNE 4371 1,48 61,5 feminin
16) ROY CHANTAL 2754 1,63 54,9 feminin
17) TREMBLAY MARC 3529 1,79 64,9 masculin
18) TREMBLAY SYLVAIN 1538 1,83 86,2 masculin
Contenu de la liste des personnes apres l'insertion de ces quatre personnes:
0) ARCAND DENYS 3333 2,05 97,5 masculin
1) BEDARD MARC-ANDRE 2636 1,43 80,5 masculin
2) BEGIN MARIE-LUCE 4101 1,62 49,0 feminin
3) DESMARAIS DENISE 3215 1,75 58,7 feminin
4) DUBE FRANCOISE 4612 1,68 67,5 feminin
5) DUMITRU PIERRE 3629 1,92 99,4 masculin
6) FILLION ERIC 2630 1,78 75,7 masculin
7) JALBERT LYNE 2168 1,63 52,6 feminin
8) LABELLE LISE 1512 1,79 68,0 feminin
9) MICHAUD NORMAND 3428 1,73 103,7 masculin
10) MOLAISON CLAUDE 1848 1,57 62,2 masculin
11) MONAST STEPHANE 1750 1,65 61,7 masculin
12) RICHER AGATHE 3563 1,65 53,1 feminin
13) RIVERIN HELENE 2340 1,71 60,8 feminin
14) ROBITAILLE SUZANNE 4119 1,58 60,2 feminin
15) ROBITAILLE SUZANNE 2244 1,68 64,5 feminin
16) ROBITAILLE SUZANNE 2325 1,72 65,4 feminin
17) ROBITAILLE SUZANNE 4371 1,48 61,5 feminin
18) ROY CHANTAL 2754 1,63 54,9 feminin
19) TREMBLAY MARC 3529 1,79 64,9 masculin
20) TREMBLAY PIERRE 4321 1,66 76,5 masculin
21) TREMBLAY SYLVAIN 1538 1,83 86,2 masculin
22) VAUCHER LISE 5511 1,75 70,1 feminin
1) ROY CHANTAL 2754 1,63 54,9 feminin
On a supprime 1 personne(s)
1) ROBITAILLE SUZANNE 2325 1,72 65,4 feminin
2) ROBITAILLE SUZANNE 2244 1,68 64,5 feminin
3) ROBITAILLE SUZANNE 4119 1,58 60,2 feminin
4) ROBITAILLE SUZANNE 4371 1,48 61,5 feminin
On a supprime 4 personne(s)
On ne trouve pas BABA ALI 0 0,00 0,0 ma
sculin
Contenu de la liste des personnes apres ces suppressions:
0) ARCAND DENYS 3333 2,05 97,5 masculin
1) BEDARD MARC-ANDRE 2636 1,43 80,5 masculin
2) BEGIN MARIE-LUCE 4101 1,62 49,0 feminin
3) DESMARAIS DENISE 3215 1,75 58,7 feminin
4) DUBE FRANCOISE 4612 1,68 67,5 feminin
5) DUMITRU PIERRE 3629 1,92 99,4 masculin
6) FILLION ERIC 2630 1,78 75,7 masculin
7) JALBERT LYNE 2168 1,63 52,6 feminin
8) LABELLE LISE 1512 1,79 68,0 feminin
9) MICHAUD NORMAND 3428 1,73 103,7 masculin
10) MOLAISON CLAUDE 1848 1,57 62,2 masculin
11) MONAST STEPHANE 1750 1,65 61,7 masculin
12) RICHER AGATHE 3563 1,65 53,1 feminin
13) RIVERIN HELENE 2340 1,71 60,8 feminin
14) TREMBLAY MARC 3529 1,79 64,9 masculin
15) TREMBLAY PIERRE 4321 1,66 76,5 masculin
16) TREMBLAY SYLVAIN 1538 1,83 86,2 masculin
17) VAUCHER LISE 5511 1,75 70,1 feminin
Press any key to continue
*/