IFT 1179 : Programmation en C# A) Tri avec Sort et

Transcription

IFT 1179 : Programmation en C# A) Tri avec Sort et
IFT 1179 : Programmation en C#
A) Tri avec Sort et Recherche avec BinarySearch:
En classe, on a déjà montré le tri des tableaux d’entiers ou de chaînes de caractères
en utilisant Array.Sort(…) ;
Cette méthode a fonctionné parfaitement car System.Int32 (associée à int) et
System.String (associée à string) ont implémenté l’interface IComparable.
On a aussi trié un tableau des stations de métro (classe Station) avec Array.Sort(. . .)
Cette méthode fonctionne car Station a implémenté l’interface IComparable.
Une fois que le tableau est trié, on peut utiliser Array.BinarySearch pour la recherche
binaire (recherche dichotomique) selon la même clé de tri.
Quelques réflexions s’imposent :
1. Peut-on trier selon une clé combinée (exemple : trier un tableau des personnes
selon d’abord le nom et prénom puis selon leurs numéros) ?
La solution se trouve dans l’exemple Sort0.cs
2. Peut-on forcer la méthode Array.Sort d’utiliser une autre méthode de comparaison
au lieu de CompareTo de IComparable ?
La réponse se trouve dans plusieurs exemples : Sort1.cs, Sort2.cs, Sort3.cs
Exemple Sort0.cs : (attention au saut de ligne de Word)
/* Fichier Sort0.cs
* Clé de tri combinée : selon d'abord les noms et prénoms puis numéros
*
* Préparé par LVN pour IFT 1179
*/
using System;
using System.IO;
class Personne : IComparable
{
private string nomPre;
private char
sexe;
private double taille, poids;
private int
numero;
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
129
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 Personne()
{
}
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;
string chaineCourante = string.Format("{0,30:S} {1,4:D}",
nomPre, numero),
chaineAutre
= string.Format("{0,30:S} {1,4:D}",
autre.nomPre, autre.numero);
return chaineCourante.CompareTo(chaineAutre);
}
}
class Sort0
{
static void LireRemplir(string nomFichier, Personne[] pers,
out int n)
{
n = 0;
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));
pers[n++] = new Personne(nom, sexe, taille, poids, num);
}
aLire.Close();
}
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
130
static void Afficher(Personne[] pers, int nbPers, string mess)
{
Console.WriteLine("Contenu du tableau des personnes " + mess
+ ":\n");
for(int i = 0; i < nbPers; i++)
Console.WriteLine("{0,3}) {1}", i, pers[i]);
Console.WriteLine();
}
static void Main(string[] args)
{
const int MAX_PERS = 20; // au maximum 20 personnes
Personne[] pers = new Personne[MAX_PERS];
int nbPers; // le nombre effectif de personnes lues
LireRemplir("R:\\Met_A05.txt", pers, out nbPers);
Afficher(pers, nbPers, "avant le tri");
Array.Sort(pers, 0, nbPers);
Afficher(pers, nbPers, "apres le tri selon d'abord les noms
et prenoms puis les numeros");
}
}
/* Exécution:
Contenu du tableau des personnes avant le tri:
0) ROY CHANTAL
feminin
1) MOLAISON CLAUDE
masculin
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
2754
1,63
54,9
1848
1,57
62,2
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
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
131
13) ROBITAILLE SUZANNE
feminin
14) DUMITRU PIERRE
masculin
15) FILLION ERIC
masculin
16) DESMARAIS DENISE
feminin
17) TREMBLAY MARC
masculin
18) TREMBLAY SYLVAIN
masculin
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 du tableau des personnes apres le tri selon d'abord les noms et
prenoms
puis les numeros:
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
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
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
2325
1,72
65,4
4119
1,58
60,2
4371
1,48
61,5
2754
1,63
54,9
3529
1,79
64,9
1538
1,83
86,2
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
132
Press any key to continue
*/
Exemple Sort1.cs : (attention au saut de ligne de Word)
/* Fichier Sort1.cs
* Peut-on ADAPTER CompareTo pour trier selon plusieurs clés ?
* (Cette version est un peu "trichée". On s'en parle en classe
*
* Préparé par LVN pour IFT 1179
*/
using System;
using System.IO;
class Personne : IComparable
{
private string nomPre;
private char
sexe;
private double taille, poids;
private int
numero;
// petit truc pour trier selon une clé voulue
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 Personne()
{
}
public int Numero
{
get { return numero; }
}
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"));
}
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
133
public int CompareTo(object obj)
{ Personne autre = (Personne) obj;
if (codeTri == 1) // selon nom et prenom
return nomPre.CompareTo(autre.nomPre) ;
else
// selon les numéros des personnes
return numero - autre.numero;
}
}
class Sort1
{
static void LireRemplir(string nomFichier, Personne[] pers,
out int n)
{
n = 0;
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));
pers[n++] = new Personne(nom, sexe, taille, poids, num);
}
aLire.Close();
}
static void Afficher(Personne[] pers, int nbPers, string mess)
{
Console.WriteLine("Contenu du tableau des personnes " + mess
+ ":\n");
for(int i = 0; i < nbPers; i++)
Console.WriteLine("{0,3}) {1}", i, pers[i]);
Console.WriteLine();
}
// clé de recherche : un nom et prénom => il faut trier selon nom
et prénom
static void ChercherDicho(Personne[] pers, int nbPers,
string nomRecherche)
{
nomRecherche = nomRecherche.ToUpper();
for (int i = nomRecherche.Length ; i < 30; i++) nomRecherche
+= " ";
Personne aChercher = new Personne(nomRecherche, ' ', 0.0,
0.0, 0);
Personne.codeTri = 1;
Array.Sort(pers, 0, nbPers);
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
134
Afficher(pers, nbPers, "apres le tri selon le nom et
prenom");
int indice = Array.BinarySearch(pers, 0, nbPers, aChercher);
if (indice >= 0)
Console.WriteLine("On trouve " + nomRecherche + " a
l'indice " +
indice + " :\n" + pers[indice]);
else
Console.WriteLine("On ne le trouve pas");
Console.WriteLine();
}
// clé de recherche : un numéro => il faut trier selon numéro
static void ChercherDicho(int numRecherche, Personne[] pers,
int nbPers)
{
Personne aChercher = new Personne("", ' ', 0.0, 0.0,
numRecherche);
Personne.codeTri = 0;
Array.Sort(pers, 0, nbPers);
Afficher(pers, nbPers, "apres le tri selon les numeros des
personnes");
int indice = Array.BinarySearch(pers, 0, nbPers, aChercher);
if (indice >= 0)
Console.WriteLine("On trouve " + numRecherche + " a
l'indice " +
indice + " :\n" + pers[indice]);
else
Console.WriteLine("On ne le trouve pas");
Console.WriteLine();
}
static void Main(string[] args)
{
const int MAX_PERS = 20; // au maximum 20 personnes
Personne[] pers = new Personne[MAX_PERS];
int nbPers; // le nombre effectif de personnes lues
LireRemplir("R:\\Met_A05.txt", pers, out nbPers);
Afficher(pers, nbPers, "avant le tri");
ChercherDicho(pers, nbPers, "Roy Chantal");
ChercherDicho(3215, pers, nbPers);
}
}
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
135
/* Exécution:
Contenu du tableau des personnes avant le tri:
0) ROY CHANTAL
feminin
1) MOLAISON CLAUDE
masculin
2) BEDARD MARC-ANDRE
masculin
3) MONAST STEPHANE
masculin
4) JALBERT LYNE
feminin
5) DUBE FRANCOISE
feminin
6) ROBITAILLE SUZANNE
feminin
7) LABELLE LISE
feminin
8) RIVERIN HELENE
feminin
9) MICHAUD NORMAND
masculin
10) RICHER AGATHE
feminin
11) BEGIN MARIE-LUCE
feminin
12) ROBITAILLE SUZANNE
feminin
13) DUMITRU PIERRE
masculin
14) FILLION ERIC
masculin
15) DESMARAIS DENISE
feminin
16) TREMBLAY MARC
masculin
17) TREMBLAY SYLVAIN
masculin
18) ROBITAILLE SUZANNE
feminin
2754
1,63
54,9
1848
1,57
62,2
2636
1,43
80,5
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
4119
1,58
60,2
Contenu du tableau des personnes apres le tri selon le nom et prenom:
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
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
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
136
6) JALBERT LYNE
feminin
7) LABELLE LISE
feminin
8) MICHAUD NORMAND
masculin
9) MOLAISON CLAUDE
masculin
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
On trouve ROY CHANTAL
ROY CHANTAL
2754
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
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
a l'indice 16 :
1,63
54,9
feminin
Contenu du tableau des personnes apres le tri selon les numeros des
personnes:
0) LABELLE LISE
feminin
1) TREMBLAY SYLVAIN
masculin
2) MONAST STEPHANE
masculin
3) MOLAISON CLAUDE
masculin
4) JALBERT LYNE
feminin
5) ROBITAILLE SUZANNE
feminin
6) RIVERIN HELENE
feminin
7) FILLION ERIC
masculin
8) BEDARD MARC-ANDRE
masculin
9) ROY CHANTAL
feminin
10) DESMARAIS DENISE
feminin
1512
1,79
68,0
1538
1,83
86,2
1750
1,65
61,7
1848
1,57
62,2
2168
1,63
52,6
2325
1,72
65,4
2340
1,71
60,8
2630
1,78
75,7
2636
1,43
80,5
2754
1,63
54,9
3215
1,75
58,7
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
137
11) MICHAUD NORMAND
masculin
12) TREMBLAY MARC
masculin
13) RICHER AGATHE
feminin
14) DUMITRU PIERRE
masculin
15) BEGIN MARIE-LUCE
feminin
16) ROBITAILLE SUZANNE
feminin
17) ROBITAILLE SUZANNE
feminin
18) DUBE FRANCOISE
feminin
On trouve 3215 a l'indice 10 :
DESMARAIS DENISE
3215
3428
1,73
103,7
3529
1,79
64,9
3563
1,65
53,1
3629
1,92
99,4
4101
1,62
49,0
4119
1,58
60,2
4371
1,48
61,5
4612
1,68
67,5
1,75
58,7
feminin
Press any key to continue
*/
Exemple Sort2.cs : (attention au saut de ligne de Word)
/* Fichier Sort2.cs
* Comparaison des chaines de caracteres : ordre Ascii vs culture ...
*
* Observez l'interface IComparer qui force le Sort d'exécuter
* la "comparaison voulue" au lieu de CompareTo implémentée (ici dans
string)
*/
using System;
using System.Collections;
class Sort2
{
class PourTrier : IComparer
{
int IComparer.Compare( Object x, Object y)
{
return String.CompareOrdinal( (string) x, (string) y);
}
}
static void Afficher(string[] tab, string mess)
{
Console.WriteLine("Contenu du tableau " + mess);
for (int i = 0; i < tab.Length ; i++)
Console.WriteLine("{0,3:D}) {1:5D}", i, tab[i]);
Console.WriteLine();
}
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
138
static void AfficherAscii(char lettre1, char lettre2)
{
for (char c = lettre1 ; c <= lettre2 ; c++)
Console.Write("{0, 3:C}", c);
Console.WriteLine();
for (char c = lettre1 ; c <= lettre2 ; c++)
Console.Write("{0, 3:D}", (int) c);
Console.WriteLine("\n");
}
static void AfficherAscii()
{
Console.WriteLine("Caracteres et ses ordres: ");
AfficherAscii('0', '9');
AfficherAscii('A', 'Z');
AfficherAscii('a', 'z');
}
static void Main(string[] args)
{
string[] tableau = { "abc", "DEF", "ABC", "XYZ", "def",
"123", "765" };
Array.Sort(tableau);
AfficherAscii();
Afficher(tableau, "apres une sorte de tri (culture
americaine)");
IComparer monTri = new PourTrier();
Array.Sort(tableau, monTri);
Afficher(tableau, "apres le tri qui respecte l'ordre
ASCII");
}
}
/* Exécution:
Caracteres et ses ordres:
0 1 2 3 4 5 6 7 8 9
48 49 50 51 52 53 54 55 56 57
A B C D E F G H I J K L M N O P Q R S T U V W
X Y Z
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
88 89 90
a b c d e f g h i j k l m n o p q r s t u v w
x y z
97 98
99100101102103104105106107108109110111112113114115116117118119120121122
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
139
Contenu du tableau apres une sorte de tri (culture americaine)
0) 123
1) 765
2) abc
3) ABC
4) def
5) DEF
6) XYZ
Contenu du tableau apres le tri qui respecte l'ordre ASCII
0) 123
1) 765
2) ABC
3) DEF
4) XYZ
5) abc
6) def
Press any key to continue
*/
Exemple Sort3.cs : (attention au saut de ligne de Word)
/* Fichier Sort3.cs
* On force le Sort d'utiliser une autre méthode de comparaison
*/
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 Personne()
{
}
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
140
public int Numero
{
get { return numero; }
}
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 Sort3
{
class PourTrier : IComparer
{
int IComparer.Compare( Object x, Object y)
{
return ((Personne) x).Numero - ((Personne) y).Numero;
}
}
static void LireRemplir(string nomFichier, Personne[] pers,
out int n)
{
n = 0;
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));
pers[n++] = new Personne(nom, sexe, taille, poids, num);
}
aLire.Close();
}
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
141
static void Afficher(Personne[] pers, int nbPers, string mess)
{
Console.WriteLine("Contenu du tableau des personnes " + mess
+ ":\n");
for(int i = 0; i < nbPers; i++)
Console.WriteLine("{0,3}) {1}", i, pers[i]);
Console.WriteLine();
}
static void ChercherDicho(Personne[] pers, int nbPers, string
nomRecherche)
{
nomRecherche = nomRecherche.ToUpper();
for (int i = nomRecherche.Length ; i < 30; i++) nomRecherche
+= " ";
Personne aChercher = new Personne(nomRecherche, ' ', 0.0,
0.0, 0);
Personne.codeTri = 1;
Array.Sort(pers, 0, nbPers);
Afficher(pers, nbPers, "apres le tri selon le nom et
prenom");
int indice = Array.BinarySearch(pers, 0, nbPers, aChercher);
if (indice >= 0)
Console.WriteLine("On trouve " + nomRecherche + " a
l'indice " +
indice + " :\n" + pers[indice]);
else
Console.WriteLine("On ne le trouve pas");
Console.WriteLine();
}
static void ChercherDicho(int numRecherche, Personne[] pers, int
nbPers)
{
Personne aChercher = new Personne("", ' ', 0.0, 0.0,
numRecherche);
Personne.codeTri = 0;
Array.Sort(pers, 0, nbPers);
Afficher(pers, nbPers, "apres le tri selon les numeros des
personnes");
int indice = Array.BinarySearch(pers, 0, nbPers, aChercher);
if (indice >= 0)
Console.WriteLine("On trouve " + numRecherche + " a
l'indice " +
indice + " :\n" + pers[indice]);
else
Console.WriteLine("On ne le trouve pas");
Console.WriteLine();
}
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
142
static void Main(string[] args)
{
const int MAX_PERS = 20; // au maximum 20 personnes
Personne[] pers = new Personne[MAX_PERS];
int nbPers; // le nombre effectif de personnes lues
LireRemplir("R:\\Met_A05.txt", pers, out nbPers);
Afficher(pers, nbPers, "avant le tri");
Array.Sort(pers, 0, nbPers);
Afficher(pers, nbPers, "apres le tri (avec CompareTo)");
IComparer monTri = new PourTrier();
Array.Sort(pers, 0, nbPers, monTri);
Afficher(pers, nbPers, "apres le tri selon les numeros des
personnes");
}
}
/* Exécution:
Contenu du tableau des personnes avant le tri:
0) ROY CHANTAL
feminin
1) MOLAISON CLAUDE
masculin
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
2754
1,63
54,9
1848
1,57
62,2
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
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
143
17) TREMBLAY MARC
masculin
18) TREMBLAY SYLVAIN
masculin
3529
1,79
64,9
1538
1,83
86,2
Contenu du tableau 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
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
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
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 du tableau des personnes apres le tri selon les numeros des
personnes:
0) LABELLE LISE
feminin
1) TREMBLAY SYLVAIN
masculin
2) MONAST STEPHANE
masculin
1512
1,79
68,0
1538
1,83
86,2
1750
1,65
61,7
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
144
3) MOLAISON CLAUDE
masculin
4) JALBERT LYNE
feminin
5) ROBITAILLE SUZANNE
feminin
6) RIVERIN HELENE
feminin
7) FILLION ERIC
masculin
8) BEDARD MARC-ANDRE
masculin
9) ROY CHANTAL
feminin
10) DESMARAIS DENISE
feminin
11) MICHAUD NORMAND
masculin
12) TREMBLAY MARC
masculin
13) RICHER AGATHE
feminin
14) DUMITRU PIERRE
masculin
15) BEGIN MARIE-LUCE
feminin
16) ROBITAILLE SUZANNE
feminin
17) ROBITAILLE SUZANNE
feminin
18) DUBE FRANCOISE
feminin
1848
1,57
62,2
2168
1,63
52,6
2325
1,72
65,4
2340
1,71
60,8
2630
1,78
75,7
2636
1,43
80,5
2754
1,63
54,9
3215
1,75
58,7
3428
1,73
103,7
3529
1,79
64,9
3563
1,65
53,1
3629
1,92
99,4
4101
1,62
49,0
4119
1,58
60,2
4371
1,48
61,5
4612
1,68
67,5
Press any key to continue
*/
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
145
B) Classe ArrayList:
http://msdn.microsoft.com/library/fre/default.asp?ur
l=/library/FRE/cpref/html/frlrfsystemcollectionsarra
ylistclasstopic.asp
Une liste tableau (ArrayList) est une liste doublement chaînée dont l’abstraction de
données se fait avec un tableau. La capacité (le nombre maximum d’éléments) et
sa taille (son nombre d’éléments) sont dynamiques.
En classe, on montrera comment trouver les informations sur cette classe.
Les notes de cours s’en viennent.
Exemple List1.cs : (attention au saut de ligne de Word)
/* Fichier List1.cs (1er exemple de ArrayList)
*/
using System;
using System.Collections;
class List1
{
static ArrayList creerListe(int nombre)
{
ArrayList liste = new ArrayList();
Console.WriteLine("\nCapacite de cette liste : {0, 3:D}",
liste.Capacity);
for (int candi = 1; candi <= nombre; candi++)
if (nombre % candi == 0)
liste.Add(candi);
Console.WriteLine("\nCapacite maintenant de cette liste :
{0, 3:D}", liste.Capacity);
return liste;
}
static void Afficher(ArrayList liste, string mess)
{
if (mess.Equals("au debut"))
Console.WriteLine("\nContenu de la liste des diviseurs de
" + liste[liste.Count-1]);
else
Console.WriteLine("\nContenu de la liste " + mess);
for (int i = 0; i < liste.Count; i++)
Console.WriteLine("{0, 3:D}) {1, 10:D}", i,
liste[i]);
}
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
146
static void Demo(ArrayList commune)
{
Afficher(commune, "des diviseurs communs de 100 et 720");
commune.RemoveAt(1);
commune.Remove(20);
Afficher(commune, "de la liste commune APRES 2
SUPPRESSIONS");
commune.Insert(0, 999);
commune.Insert(3, 777);
commune[5] = 666;
Afficher(commune, "de la liste commune APRES 2 AJOUTS et 1
MODIFICATION");
commune.Sort();
Afficher(commune, "des diviseurs communs de 100 et 720 apres
le tri");
int indice = commune.BinarySearch(4);
Console.WriteLine("On trouve 4 a l'indice " + indice);
}
static ArrayList creerListe(ArrayList liste1, ArrayList liste2)
{
ArrayList liste = new ArrayList();
for (int i = liste1.Count-1; i >= 0; i--)
if (liste2.Contains(liste1[i]))
liste.Add(liste1[i]);
return liste;
}
static void Main(string[] args)
{
const int NOMBRE1 = 100, NOMBRE2 = 720;
ArrayList divi100 = creerListe(NOMBRE1);
Afficher(divi100, "au debut");
ArrayList divi720 = creerListe(NOMBRE2);
Afficher(divi720, "au debut");
ArrayList commune = creerListe(divi100, divi720);
Demo(commune);
}
}
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
147
/* Exécution:
Capacite de cette liste :
16
Capacite maintenant de cette liste :
16
Contenu de la liste des diviseurs de 100
0)
1
1)
2
2)
4
3)
5
4)
10
5)
20
6)
25
7)
50
8)
100
Capacite de cette liste :
16
Capacite maintenant de cette liste :
32
Contenu de la liste des diviseurs de 720
0)
1
1)
2
2)
3
3)
4
4)
5
5)
6
6)
8
7)
9
8)
10
9)
12
10)
15
11)
16
12)
18
13)
20
14)
24
15)
30
16)
36
17)
40
18)
45
19)
48
20)
60
21)
72
22)
80
23)
90
24)
120
25)
144
26)
180
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
148
27)
28)
29)
240
360
720
Contenu de la liste des diviseurs communs de 100 et 720
0)
20
1)
10
2)
5
3)
4
4)
2
5)
1
Contenu de la liste de la liste commune APRES 2 SUPPRESSIONS
0)
5
1)
4
2)
2
3)
1
Contenu de la liste de la liste commune APRES 2 AJOUTS et 1
MODIFICATION
0)
999
1)
5
2)
4
3)
777
4)
2
5)
666
Contenu de la liste des diviseurs communs de 100 et 720 apres le tri
0)
2
1)
4
2)
5
3)
666
4)
777
5)
999
On trouve 4 a l'indice 1
Press any key to continue*/
IFT 1179 : automne 2005
Tri avec Sort, recherche dichotomique avec BinarySearch, . . .
Classe ArrayList
149