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