07-Collections.html 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="generator" content="pandoc" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  7. <title>Collections</title>
  8. <style type="text/css">
  9. code{white-space: pre-wrap;}
  10. span.smallcaps{font-variant: small-caps;}
  11. span.underline{text-decoration: underline;}
  12. div.column{display: inline-block; vertical-align: top; width: 50%;}
  13. </style>
  14. <style type="text/css">
  15. a.sourceLine { display: inline-block; line-height: 1.25; }
  16. a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
  17. a.sourceLine:empty { height: 1.2em; position: absolute; }
  18. .sourceCode { overflow: visible; }
  19. code.sourceCode { white-space: pre; position: relative; }
  20. div.sourceCode { margin: 1em 0; }
  21. pre.sourceCode { margin: 0; }
  22. @media screen {
  23. div.sourceCode { overflow: auto; }
  24. }
  25. @media print {
  26. code.sourceCode { white-space: pre-wrap; }
  27. a.sourceLine { text-indent: -1em; padding-left: 1em; }
  28. }
  29. pre.numberSource a.sourceLine
  30. { position: relative; }
  31. pre.numberSource a.sourceLine:empty
  32. { position: absolute; }
  33. pre.numberSource a.sourceLine::before
  34. { content: attr(data-line-number);
  35. position: absolute; left: -5em; text-align: right; vertical-align: baseline;
  36. border: none; pointer-events: all;
  37. -webkit-touch-callout: none; -webkit-user-select: none;
  38. -khtml-user-select: none; -moz-user-select: none;
  39. -ms-user-select: none; user-select: none;
  40. padding: 0 4px; width: 4em;
  41. color: #aaaaaa;
  42. }
  43. pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
  44. div.sourceCode
  45. { }
  46. @media screen {
  47. a.sourceLine::before { text-decoration: underline; }
  48. }
  49. code span.al { color: #ff0000; font-weight: bold; } /* Alert */
  50. code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
  51. code span.at { color: #7d9029; } /* Attribute */
  52. code span.bn { color: #40a070; } /* BaseN */
  53. code span.bu { } /* BuiltIn */
  54. code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
  55. code span.ch { color: #4070a0; } /* Char */
  56. code span.cn { color: #880000; } /* Constant */
  57. code span.co { color: #60a0b0; font-style: italic; } /* Comment */
  58. code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
  59. code span.do { color: #ba2121; font-style: italic; } /* Documentation */
  60. code span.dt { color: #902000; } /* DataType */
  61. code span.dv { color: #40a070; } /* DecVal */
  62. code span.er { color: #ff0000; font-weight: bold; } /* Error */
  63. code span.ex { } /* Extension */
  64. code span.fl { color: #40a070; } /* Float */
  65. code span.fu { color: #06287e; } /* Function */
  66. code span.im { } /* Import */
  67. code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
  68. code span.kw { color: #007020; font-weight: bold; } /* Keyword */
  69. code span.op { color: #666666; } /* Operator */
  70. code span.ot { color: #007020; } /* Other */
  71. code span.pp { color: #bc7a00; } /* Preprocessor */
  72. code span.sc { color: #4070a0; } /* SpecialChar */
  73. code span.ss { color: #bb6688; } /* SpecialString */
  74. code span.st { color: #4070a0; } /* String */
  75. code span.va { color: #19177c; } /* Variable */
  76. code span.vs { color: #4070a0; } /* VerbatimString */
  77. code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
  78. </style>
  79. <link rel="stylesheet" href="pandoc.css">
  80. <!--[if lt IE 9]>
  81. <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  82. <![endif]-->
  83. </head>
  84. <body>
  85. <div class="doctitle">Collections</div>
  86. <nav id="TOC">
  87. <ul>
  88. <li><a href="#introduction">Introduction</a></li>
  89. <li><a href="#les-list">Les “List”</a><ul>
  90. <li><a href="#linterface-list">L’interface List</a></li>
  91. <li><a href="#propriétés">Propriétés</a><ul>
  92. <li><a href="#taille-de-la-liste">Taille de la liste</a></li>
  93. <li><a href="#ordre-des-éléments">Ordre des éléments</a></li>
  94. <li><a href="#doublons">Doublons</a></li>
  95. </ul></li>
  96. <li><a href="#méthodes-principales">Méthodes principales</a><ul>
  97. <li><a href="#taille-de-la-liste-1">Taille de la liste</a></li>
  98. <li><a href="#accès-aux-éléments">Accès aux éléments</a></li>
  99. <li><a href="#ajout-et-suppression-déléments">Ajout et suppression d’éléments</a></li>
  100. <li><a href="#typage-des-objets-contenu">Typage des objets contenu</a></li>
  101. <li><a href="#création">Création</a></li>
  102. </ul></li>
  103. </ul></li>
  104. <li><a href="#typage-des-objets-et-généricité">Typage des objets et généricité</a><ul>
  105. <li><a href="#avant-les-generics">Avant les Generics</a><ul>
  106. <li><a href="#avant-java-5.0-tiger">Avant Java 5.0 (Tiger)</a></li>
  107. <li><a href="#transtypage-nécessaire">Transtypage nécessaire</a></li>
  108. </ul></li>
  109. <li><a href="#avec-les-generics">Avec les Generics</a><ul>
  110. <li><a href="#association-du-type-à-la-liste">Association du type à la liste</a></li>
  111. <li><a href="#diamond-operator">Diamond operator</a></li>
  112. <li><a href="#avant-java-7">Avant Java 7</a></li>
  113. <li><a href="#exemple-dutilisation">Exemple d’utilisation</a></li>
  114. </ul></li>
  115. </ul></li>
  116. <li><a href="#autoboxing-unboxing">Autoboxing / unboxing</a><ul>
  117. <li><a href="#stockage-des-types-primitifs">Stockage des types primitifs</a><ul>
  118. <li><a href="#exemple">Exemple</a></li>
  119. <li><a href="#un-type-une-contenant">Un type = une contenant</a></li>
  120. </ul></li>
  121. </ul></li>
  122. <li><a href="#boucles-for-et-for-each">Boucles for(;;) et for-each</a><ul>
  123. <li><a href="#deux-formes-ditérations">Deux formes d’itérations</a></li>
  124. <li><a href="#interface-list-et-classes-associées">Interface List et classes associées</a></li>
  125. </ul></li>
  126. <li><a href="#exercices">Exercices</a><ul>
  127. <li><a href="#parcours-de-liste">Parcours de liste</a></li>
  128. </ul></li>
  129. <li><a href="#vue-densemble-des-collections">Vue d’ensemble des Collections</a><ul>
  130. <li><a href="#les-classes-collection">Les classes Collection</a></li>
  131. <li><a href="#set">Set</a><ul>
  132. <li><a href="#définition">Définition</a></li>
  133. <li><a href="#exemple-1">Exemple</a></li>
  134. <li><a href="#sous-types">Sous-types</a></li>
  135. </ul></li>
  136. <li><a href="#queue">Queue</a><ul>
  137. <li><a href="#usage">Usage</a></li>
  138. <li><a href="#méthodes">Méthodes</a></li>
  139. <li><a href="#exemple-2">Exemple</a></li>
  140. </ul></li>
  141. </ul></li>
  142. <li><a href="#linterface-map-et-ses-sous-classes">L’interface Map et ses sous-classes</a><ul>
  143. <li><a href="#association-clef-valeur">Association clef-valeur</a></li>
  144. <li><a href="#types-des-clefs-et-des-valeurs">Types des clefs et des valeurs</a></li>
  145. <li><a href="#exemple-3">Exemple</a></li>
  146. <li><a href="#classes-de-type-map">Classes de type Map</a></li>
  147. </ul></li>
  148. <li><a href="#parcours">Parcours</a><ul>
  149. <li><a href="#interface-iterator">Interface Iterator</a></li>
  150. <li><a href="#cas-particulier-map">Cas particulier: Map</a></li>
  151. <li><a href="#iterator">Iterator</a><ul>
  152. <li><a href="#exemple-de-parcours">Exemple de parcours</a></li>
  153. <li><a href="#parcours-avec-for-et-for-each">Parcours avec for et for-each</a></li>
  154. </ul></li>
  155. </ul></li>
  156. <li><a href="#application">Application</a><ul>
  157. <li><a href="#list-création-de-listes-de-véhicules">List : création de listes de véhicules</a></li>
  158. <li><a href="#list-affichage-dune-liste-de-véhicules">List: affichage d’une liste de véhicules</a></li>
  159. <li><a href="#queue-et-set">(Queue et Set)</a></li>
  160. <li><a href="#map-référencement-de-véhicule">Map : référencement de véhicule</a></li>
  161. <li><a href="#iterator-application">Iterator: application</a></li>
  162. </ul></li>
  163. </ul>
  164. </nav>
  165. <h1 id="introduction">Introduction</h1>
  166. <p>Les collections en Java permettent de gérer des <strong>ensembles</strong> d’objets.</p>
  167. <p>Java propose par défaut une bibliothèque de classes permettant de couvrir l’essentiel des besoins d’un programmeur pour gérer des <strong>ensembles</strong>.</p>
  168. <p>Pour commencer, nous allons étudier la gestion de liste d’objets (<code>List</code>/<code>ArrayList</code>), mais nous verrons plus tard qu’il est possible d’utiliser d’autres types d’ensemble.</p>
  169. <p>Nous allons également découvrir l’utilité des Generics dans l’usage des collections, ainsi que l’Autoboxing/Unboxing.</p>
  170. <h1 id="les-list">Les “List”</h1>
  171. <h2 id="linterface-list">L’interface List</h2>
  172. <p>Un premier type de collection très utilisé est <code>List</code>.</p>
  173. <p>Il permet de traiter un ensemble d’objets sous la forme de liste.</p>
  174. <h2 id="propriétés">Propriétés</h2>
  175. <h3 id="taille-de-la-liste">Taille de la liste</h3>
  176. <ul>
  177. <li>C’est le nombre d’éléments qu’elle contient.</li>
  178. <li>Elle peut être vide</li>
  179. </ul>
  180. <h3 id="ordre-des-éléments">Ordre des éléments</h3>
  181. <p>Une liste est ordonnée.</p>
  182. <h3 id="doublons">Doublons</h3>
  183. <p>Le nombre d’objets distinct peut être différent du nombre d’enregistrement.</p>
  184. <ul>
  185. <li>Autrement dit, elle peut contenir des doublons.</li>
  186. </ul>
  187. <h2 id="méthodes-principales">Méthodes principales</h2>
  188. <p><code>java.util.List</code> est une interface qui propose les fonctions suivantes (non exhaustif).</p>
  189. <h3 id="taille-de-la-liste-1">Taille de la liste</h3>
  190. <ul>
  191. <li><code>public int size()</code> : détermine le nombre d’éléments dans la liste (et donc l’index maximal auquel on peut accéder)</li>
  192. </ul>
  193. <h3 id="accès-aux-éléments">Accès aux éléments</h3>
  194. <ul>
  195. <li><code>public E get(int index)</code> : récupère l’élément positionné à l’index donné en paramètre</li>
  196. <li><code>public boolean contains(Object o)</code>: indique si oui ou non l’objet passé en paramètre est contenu dans la liste.</li>
  197. <li><code>public int indexOf(Object o)</code> : indique l’index où se positionne l’objet passé en paramètre dans la liste.</li>
  198. </ul>
  199. <h3 id="ajout-et-suppression-déléments">Ajout et suppression d’éléments</h3>
  200. <ul>
  201. <li><code>public void add(E e)</code> : ajoute un élément de type <code>E</code> dans la liste</li>
  202. <li><code>public E remove(int index)</code> : supprime un élément de type <code>E</code> dans la liste et renvoie cet élément</li>
  203. <li><code>public boolean remove(Object o)</code> : supprime la première occurrence trouvé de l’élément passé en paramètre de la liste</li>
  204. </ul>
  205. <h3 id="typage-des-objets-contenu">Typage des objets contenu</h3>
  206. <p>Vous aurez remarqué le type de retour de <code>get(int)</code>. <code>E</code> est le type d’objet contenu par la liste. Nous allons voir à quoi cela correspond dans le paragraphe suivant.</p>
  207. <h3 id="création">Création</h3>
  208. <p>L’interface <code>List</code> ne peut être instanciée directement.</p>
  209. <p><code>java.util.ArrayList</code> est une classe (concrète) qui implémente cette interface et qui peut être instanciée.</p>
  210. <h1 id="typage-des-objets-et-généricité">Typage des objets et généricité</h1>
  211. <p>Une <code>List</code>, par essence, permet de stocker n’importe quel objet. Ce sont donc des instances d’<code>Object</code> qui sont stockés dans une liste.</p>
  212. <p>Il serait peu pratique de devoir spécifier à chaque appel des méthodes <code>get(int)</code>, <code>remove(int)</code> le type de l’objet retourné.</p>
  213. <h2 id="avant-les-generics">Avant les Generics</h2>
  214. <h3 id="avant-java-5.0-tiger">Avant Java 5.0 (Tiger)</h3>
  215. <p>Dans les version antérieures à la version 1.5 (ou 5.0) de Java, il était nécessaire d’écrire ceci:</p>
  216. <div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> AvantLesGenerics{</a>
  217. <a class="sourceLine" id="cb1-2" data-line-number="2"> <span class="bu">List</span> list = <span class="kw">new</span> <span class="bu">ArrayList</span>();</a>
  218. <a class="sourceLine" id="cb1-3" data-line-number="3"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">init</span>(){</a>
  219. <a class="sourceLine" id="cb1-4" data-line-number="4"> <span class="bu">Date</span> date = <span class="kw">new</span> <span class="bu">Date</span>(<span class="dv">11</span>, <span class="dv">12</span>, <span class="dv">2013</span>);</a>
  220. <a class="sourceLine" id="cb1-5" data-line-number="5"> list.<span class="fu">add</span>(date);</a>
  221. <a class="sourceLine" id="cb1-6" data-line-number="6"> }</a>
  222. <a class="sourceLine" id="cb1-7" data-line-number="7"></a>
  223. <a class="sourceLine" id="cb1-8" data-line-number="8"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">testSiPremiereDateValide</span>(){</a>
  224. <a class="sourceLine" id="cb1-9" data-line-number="9"> <span class="bu">Date</span> d = (<span class="bu">Date</span>)list.<span class="fu">get</span>(<span class="dv">0</span>); <span class="co">//Transtypage indispensable</span></a>
  225. <a class="sourceLine" id="cb1-10" data-line-number="10"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(d.<span class="fu">estValide</span>());</a>
  226. <a class="sourceLine" id="cb1-11" data-line-number="11"> }</a>
  227. <a class="sourceLine" id="cb1-12" data-line-number="12">}</a></code></pre></div>
  228. <h3 id="transtypage-nécessaire">Transtypage nécessaire</h3>
  229. <p>En l’absence de transtypage, le compilateur indiquait une erreur, car la classe par défaut de <code>List</code> est <code>Object</code> et non <code>Date</code>.</p>
  230. <p>Ce type de programmation était lourd. En effet, à la place de :</p>
  231. <div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="bu">Date</span> d = (<span class="bu">Date</span>)list.<span class="fu">get</span>(<span class="dv">0</span>); <span class="co">//Transtypage indispensable</span></a></code></pre></div>
  232. <p>il serait plus simple d’écrire:</p>
  233. <div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="bu">Date</span> d = list.<span class="fu">get</span>(<span class="dv">0</span>); <span class="co">//Utilisation directe de la méthode</span></a></code></pre></div>
  234. <p>Ceci est possible depuis la version 1.5 de Java :</p>
  235. <ul>
  236. <li>grâce aux <code>Generics</code></li>
  237. </ul>
  238. <h2 id="avec-les-generics">Avec les Generics</h2>
  239. <h3 id="association-du-type-à-la-liste">Association du type à la liste</h3>
  240. <p>Juste après la déclaration du type (<code>List</code>), il est possible d’indiquer le type d’objet qu’elle contient.</p>
  241. <p>Pour cela, il suffit de noter le type entre chevrons <code>&lt;</code> et <code>&gt;</code> :</p>
  242. <p>Cette déclaration indique que la liste contiendra des objets de type <code>Date</code>.</p>
  243. <p><code>List &lt;Date&gt;</code>.</p>
  244. <h3 id="diamond-operator">Diamond operator</h3>
  245. <p>Une fois le type déclaré pour l’interface <code>List</code>, il n’est pas utile de le rappeler lors de l’instanciation.</p>
  246. <div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="bu">List</span>&lt;<span class="bu">Date</span>&gt; list = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a></code></pre></div>
  247. <p>Vous noterez que <code>ArrayList</code> est suivi d’un <em>diamant</em> (<em>diamond operator</em>): deux chevrons accolés <code>&lt;&gt;</code>.</p>
  248. <p>Ceci permet au compilateur de savoir que le type générique correspondra à celui de la variable telle que déclarée précédemment</p>
  249. <h3 id="avant-java-7">Avant Java 7</h3>
  250. <p>Il était obligatoire d’écrire explicitement le type lors de l’appel au constructeur avant la version Java SE 7:</p>
  251. <p>la version du code qui compilait dans ce cas était:</p>
  252. <p><code>List&lt;Date&gt; list = new ArrayList&lt;Date&gt;();</code></p>
  253. <p>Ce n’est plus nécessaire depuis la version 7.0.</p>
  254. <h3 id="exemple-dutilisation">Exemple d’utilisation</h3>
  255. <div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> AvecLesGenerics{</a>
  256. <a class="sourceLine" id="cb5-2" data-line-number="2"> <span class="bu">List</span>&lt;<span class="bu">Date</span>&gt; list = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a>
  257. <a class="sourceLine" id="cb5-3" data-line-number="3"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">init</span>(){</a>
  258. <a class="sourceLine" id="cb5-4" data-line-number="4"> <span class="bu">Date</span> date = <span class="kw">new</span> <span class="bu">Date</span>(<span class="dv">11</span>,<span class="dv">12</span>,<span class="dv">2013</span>);</a>
  259. <a class="sourceLine" id="cb5-5" data-line-number="5"> list.<span class="fu">add</span>(date);</a>
  260. <a class="sourceLine" id="cb5-6" data-line-number="6"> }</a>
  261. <a class="sourceLine" id="cb5-7" data-line-number="7"></a>
  262. <a class="sourceLine" id="cb5-8" data-line-number="8"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">testSiPremiereDateValide</span>(){</a>
  263. <a class="sourceLine" id="cb5-9" data-line-number="9"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(list.<span class="fu">get</span>(<span class="dv">0</span>).<span class="fu">estValide</span>());</a>
  264. <a class="sourceLine" id="cb5-10" data-line-number="10"> }</a>
  265. <a class="sourceLine" id="cb5-11" data-line-number="11">}</a></code></pre></div>
  266. <p>Nous disposons donc d’un outil puissant et versatile pour stocker des listes d’objets.</p>
  267. <p>Cette notion de <code>Generics</code> reste à approfondir mais ce que nous venons de voir va nous suffire dans un premier temps.</p>
  268. <h1 id="autoboxing-unboxing">Autoboxing / unboxing</h1>
  269. <h2 id="stockage-des-types-primitifs">Stockage des types primitifs</h2>
  270. <h3 id="exemple">Exemple</h3>
  271. <p>L’intérêt des collections est qu’elles permettent également de gérer des types primitifs.</p>
  272. <p>En effet, même si ces types ne sont pas des instances, ils vont pouvoir être encapsulés dans des objets.</p>
  273. <p>Ainsi, on aura la possibilité de stocker un <code>int</code> dans un objet de type <code>Integer</code>.</p>
  274. <p>Observez bien le code suivant:</p>
  275. <div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> IntBoxing {</a>
  276. <a class="sourceLine" id="cb6-2" data-line-number="2"> <span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; listeInt = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a>
  277. <a class="sourceLine" id="cb6-3" data-line-number="3"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">init</span>(){</a>
  278. <a class="sourceLine" id="cb6-4" data-line-number="4"> <span class="dt">int</span> monNombrePrimitif = <span class="dv">24</span>;</a>
  279. <a class="sourceLine" id="cb6-5" data-line-number="5"> listeInt.<span class="fu">add</span>(monNombrePrimitif);</a>
  280. <a class="sourceLine" id="cb6-6" data-line-number="6"> }</a>
  281. <a class="sourceLine" id="cb6-7" data-line-number="7"></a>
  282. <a class="sourceLine" id="cb6-8" data-line-number="8"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">faire</span>(){</a>
  283. <a class="sourceLine" id="cb6-9" data-line-number="9"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(listeInt.<span class="fu">get</span>(<span class="dv">0</span>) + <span class="dv">12</span>);</a>
  284. <a class="sourceLine" id="cb6-10" data-line-number="10"> }</a>
  285. <a class="sourceLine" id="cb6-11" data-line-number="11"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
  286. <a class="sourceLine" id="cb6-12" data-line-number="12"> IntBoxing ib = <span class="kw">new</span> <span class="fu">IntBoxing</span>();</a>
  287. <a class="sourceLine" id="cb6-13" data-line-number="13"> ib.<span class="fu">init</span>();</a>
  288. <a class="sourceLine" id="cb6-14" data-line-number="14"> ib.<span class="fu">faire</span>();</a>
  289. <a class="sourceLine" id="cb6-15" data-line-number="15"> }</a>
  290. <a class="sourceLine" id="cb6-16" data-line-number="16">}</a></code></pre></div>
  291. <p>Il est parfaitement fonctionnel.</p>
  292. <h3 id="un-type-une-contenant">Un type = une contenant</h3>
  293. <p>Il vous est possible d’utiliser les collections pour stocker les types primitifs suivants en utilisant les <em>réceptacles</em> associés :</p>
  294. <table>
  295. <thead>
  296. <tr class="header">
  297. <th> Type primitif</th>
  298. <th>Classe réceptacle</th>
  299. </tr>
  300. </thead>
  301. <tbody>
  302. <tr class="odd">
  303. <td>boolean</td>
  304. <td>Boolean </td>
  305. </tr>
  306. <tr class="even">
  307. <td>byte</td>
  308. <td>Byte  </td>
  309. </tr>
  310. <tr class="odd">
  311. <td>char</td>
  312. <td>Character</td>
  313. </tr>
  314. <tr class="even">
  315. <td>float</td>
  316. <td>Float</td>
  317. </tr>
  318. <tr class="odd">
  319. <td>int</td>
  320. <td>Integer</td>
  321. </tr>
  322. <tr class="even">
  323. <td>long</td>
  324. <td>Long</td>
  325. </tr>
  326. <tr class="odd">
  327. <td>short</td>
  328. <td>Short</td>
  329. </tr>
  330. <tr class="even">
  331. <td>double</td>
  332. <td>Double</td>
  333. </tr>
  334. </tbody>
  335. </table>
  336. <p>Ces réceptacles sont des objets <em>boîtes</em> (box) dans lesquelles sont stockées les valeurs primitives afin qu’elles soient prises en charge par les collections comme des objets.</p>
  337. <h1 id="boucles-for-et-for-each">Boucles for(;;) et for-each</h1>
  338. <h2 id="deux-formes-ditérations">Deux formes d’itérations</h2>
  339. <p>Il est possible de parcourir une liste de deux manières avec une boucle <code>for</code>:</p>
  340. <ul>
  341. <li>la construction classique : <code>for(int i = 0 ; i &lt; l.size() ; i++)</code></li>
  342. <li>la construction <em>for-each</em> : <code>for (Date date : listeDate)</code></li>
  343. </ul>
  344. <h2 id="interface-list-et-classes-associées">Interface List et classes associées</h2>
  345. <p>Nous avons utilisé l’interface <code>List</code> avec la classe <code>ArrayList</code>. Mais il est possible de l’interchanger avec une autre classe sans effet sur le reste du code.</p>
  346. <p>Par exemple avec la classe <code>LinkedList</code>:</p>
  347. <div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> IntBoxing {</a>
  348. <a class="sourceLine" id="cb7-2" data-line-number="2"> <span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; listeInt = <span class="kw">new</span> <span class="bu">LinkedList</span>&lt;&gt;();</a>
  349. <a class="sourceLine" id="cb7-3" data-line-number="3"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">init</span>(){</a>
  350. <a class="sourceLine" id="cb7-4" data-line-number="4"> <span class="dt">int</span> monNombrePrimitif = <span class="dv">24</span>;</a>
  351. <a class="sourceLine" id="cb7-5" data-line-number="5"> listeInt.<span class="fu">add</span>(monNombrePrimitif);</a>
  352. <a class="sourceLine" id="cb7-6" data-line-number="6"> }</a>
  353. <a class="sourceLine" id="cb7-7" data-line-number="7"> <span class="co">//... (le reste du code est identique à l&#39;exemple précédent</span></a>
  354. <a class="sourceLine" id="cb7-8" data-line-number="8">}</a></code></pre></div>
  355. <p>La classe <code>LinkedList</code> est une liste chaînée. Selon le cas, son mode de fonctionnement sera plus performant que si on utilise une <code>ArrayList</code>.</p>
  356. <p>Vous pouvez tester cela avec le code suivant:</p>
  357. <div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.util.ArrayList;</span></a>
  358. <a class="sourceLine" id="cb8-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.util.LinkedList;</span></a>
  359. <a class="sourceLine" id="cb8-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.util.List;</span></a>
  360. <a class="sourceLine" id="cb8-4" data-line-number="4"></a>
  361. <a class="sourceLine" id="cb8-5" data-line-number="5"><span class="kw">public</span> <span class="kw">class</span> PerformancesList {</a>
  362. <a class="sourceLine" id="cb8-6" data-line-number="6"></a>
  363. <a class="sourceLine" id="cb8-7" data-line-number="7"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">final</span> <span class="dt">int</span> MAX_VALUE = <span class="dv">100000</span>;</a>
  364. <a class="sourceLine" id="cb8-8" data-line-number="8"></a>
  365. <a class="sourceLine" id="cb8-9" data-line-number="9"> <span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; arrayList = <span class="kw">new</span> <span class="bu">ArrayList</span>&lt;&gt;();</a>
  366. <a class="sourceLine" id="cb8-10" data-line-number="10"> <span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; linkedList = <span class="kw">new</span> <span class="bu">LinkedList</span>&lt;&gt;();</a>
  367. <a class="sourceLine" id="cb8-11" data-line-number="11"></a>
  368. <a class="sourceLine" id="cb8-12" data-line-number="12"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">insert</span>(<span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; liste, <span class="dt">int</span> maxValue) {</a>
  369. <a class="sourceLine" id="cb8-13" data-line-number="13"> <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; maxValue; i++) {</a>
  370. <a class="sourceLine" id="cb8-14" data-line-number="14"> liste.<span class="fu">add</span>(<span class="dv">0</span>, i);</a>
  371. <a class="sourceLine" id="cb8-15" data-line-number="15"> }</a>
  372. <a class="sourceLine" id="cb8-16" data-line-number="16"> }</a>
  373. <a class="sourceLine" id="cb8-17" data-line-number="17"></a>
  374. <a class="sourceLine" id="cb8-18" data-line-number="18"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">parcours</span>(<span class="bu">List</span>&lt;<span class="bu">Integer</span>&gt; liste, <span class="dt">int</span> maxValue) {</a>
  375. <a class="sourceLine" id="cb8-19" data-line-number="19"> <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; maxValue; i++) {</a>
  376. <a class="sourceLine" id="cb8-20" data-line-number="20"> <span class="bu">Integer</span> integer = liste.<span class="fu">get</span>(i);</a>
  377. <a class="sourceLine" id="cb8-21" data-line-number="21"> }</a>
  378. <a class="sourceLine" id="cb8-22" data-line-number="22"> }</a>
  379. <a class="sourceLine" id="cb8-23" data-line-number="23"></a>
  380. <a class="sourceLine" id="cb8-24" data-line-number="24"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
  381. <a class="sourceLine" id="cb8-25" data-line-number="25"> PerformancesList pl = <span class="kw">new</span> <span class="fu">PerformancesList</span>();</a>
  382. <a class="sourceLine" id="cb8-26" data-line-number="26"> pl.<span class="fu">insert</span>(pl.<span class="fu">arrayList</span>, <span class="dv">10</span>);</a>
  383. <a class="sourceLine" id="cb8-27" data-line-number="27"> pl.<span class="fu">insert</span>(pl.<span class="fu">linkedList</span>, <span class="dv">10</span>);</a>
  384. <a class="sourceLine" id="cb8-28" data-line-number="28"></a>
  385. <a class="sourceLine" id="cb8-29" data-line-number="29"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;-- Insertion&quot;</span>);</a>
  386. <a class="sourceLine" id="cb8-30" data-line-number="30"> <span class="dt">long</span> debutOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
  387. <a class="sourceLine" id="cb8-31" data-line-number="31"> pl.<span class="fu">insert</span>(pl.<span class="fu">linkedList</span>, MAX_VALUE);</a>
  388. <a class="sourceLine" id="cb8-32" data-line-number="32"> <span class="dt">long</span> finOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
  389. <a class="sourceLine" id="cb8-33" data-line-number="33"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Linked :&quot;</span> + (finOp - debutOp) / <span class="dv">1000000</span> + <span class="st">&quot;ms&quot;</span>);</a>
  390. <a class="sourceLine" id="cb8-34" data-line-number="34"></a>
  391. <a class="sourceLine" id="cb8-35" data-line-number="35"> debutOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
  392. <a class="sourceLine" id="cb8-36" data-line-number="36"> pl.<span class="fu">insert</span>(pl.<span class="fu">arrayList</span>, MAX_VALUE);</a>
  393. <a class="sourceLine" id="cb8-37" data-line-number="37"> finOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
  394. <a class="sourceLine" id="cb8-38" data-line-number="38"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Array :&quot;</span> + (finOp - debutOp) / <span class="dv">1000000</span> + <span class="st">&quot;ms&quot;</span>);</a>
  395. <a class="sourceLine" id="cb8-39" data-line-number="39"></a>
  396. <a class="sourceLine" id="cb8-40" data-line-number="40"> pl.<span class="fu">parcours</span>(pl.<span class="fu">arrayList</span>, <span class="dv">10</span>);</a>
  397. <a class="sourceLine" id="cb8-41" data-line-number="41"> pl.<span class="fu">parcours</span>(pl.<span class="fu">linkedList</span>, <span class="dv">10</span>);</a>
  398. <a class="sourceLine" id="cb8-42" data-line-number="42"></a>
  399. <a class="sourceLine" id="cb8-43" data-line-number="43"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;-- Parcours&quot;</span>);</a>
  400. <a class="sourceLine" id="cb8-44" data-line-number="44"> debutOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
  401. <a class="sourceLine" id="cb8-45" data-line-number="45"> pl.<span class="fu">parcours</span>(pl.<span class="fu">linkedList</span>, MAX_VALUE);</a>
  402. <a class="sourceLine" id="cb8-46" data-line-number="46"> finOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
  403. <a class="sourceLine" id="cb8-47" data-line-number="47"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Linked :&quot;</span> + (finOp - debutOp) / <span class="dv">1000000</span> + <span class="st">&quot;ms&quot;</span>);</a>
  404. <a class="sourceLine" id="cb8-48" data-line-number="48"></a>
  405. <a class="sourceLine" id="cb8-49" data-line-number="49"> debutOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
  406. <a class="sourceLine" id="cb8-50" data-line-number="50"> pl.<span class="fu">parcours</span>(pl.<span class="fu">arrayList</span>, MAX_VALUE);</a>
  407. <a class="sourceLine" id="cb8-51" data-line-number="51"> finOp = <span class="bu">System</span>.<span class="fu">nanoTime</span>();</a>
  408. <a class="sourceLine" id="cb8-52" data-line-number="52"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;Array :&quot;</span> + (finOp - debutOp) / <span class="dv">1000000</span> + <span class="st">&quot;ms&quot;</span>);</a>
  409. <a class="sourceLine" id="cb8-53" data-line-number="53"></a>
  410. <a class="sourceLine" id="cb8-54" data-line-number="54"> }</a>
  411. <a class="sourceLine" id="cb8-55" data-line-number="55">}</a></code></pre></div>
  412. <p>Que constatez-vous à l’exécution de ce code ?</p>
  413. <h1 id="exercices">Exercices</h1>
  414. <h2 id="parcours-de-liste">Parcours de liste</h2>
  415. <p>Remplissez une liste avec des entiers numérotés de 1 à 10.</p>
  416. <p>Utilisez les deux types de boucle <code>for</code> pour parcourir une <code>List</code> d’entiers (de 1 à 20).</p>
  417. <h1 id="vue-densemble-des-collections">Vue d’ensemble des Collections</h1>
  418. <h2 id="les-classes-collection">Les classes Collection</h2>
  419. <p>Le diagramme suivant donne une vision globale des Collections en Java</p>
  420. <figure>
  421. <img src="images/Collection-Map.png" alt="Collections" /><figcaption>Collections</figcaption>
  422. </figure>
  423. <p>On s’aperçoit que <code>List</code> est un sous-type de <code>Collection</code>, tout comme <code>Set</code> ou <code>Queue</code>.</p>
  424. <p>Nous allons ici nous intéresser sur certaines fonctionnalités de base de ces classes <code>Set</code> et <code>Queue</code>.</p>
  425. <p>Vous pouvez trouver une documentation plus complète sur les collections <a href="https://en.wikibooks.org/wiki/Java_Programming/Collection">ici</a></p>
  426. <h2 id="set">Set</h2>
  427. <h3 id="définition">Définition</h3>
  428. <p>L’interface <code>Set</code> permet de contenir un ensemble d’objets. Cet ensemble ne contient pas de doublon (un objet y est stocké une et une seule fois).</p>
  429. <ul>
  430. <li>Selon son contrat, toute classe qui implémente l’interface <code>Set</code> se base sur la méthode <code>equals</code> pour s’assurer qu’aucun doublon n’est inséré dans la collection.</li>
  431. <li>Ainsi, l’ajout d’un élément déjà présent dans le <code>Set</code> n’aura aucun effet.</li>
  432. <li>De même l’ajout d’un élément dont la méthode <code>equals</code> renvoie <code>true</code> pour un des éléments du <code>Set</code>, n’entraînera pas sa présence en doublon.</li>
  433. </ul>
  434. <h3 id="exemple-1">Exemple</h3>
  435. <div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.collections;</span></a>
  436. <a class="sourceLine" id="cb9-2" data-line-number="2"></a>
  437. <a class="sourceLine" id="cb9-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.util.Set;</span></a>
  438. <a class="sourceLine" id="cb9-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.util.TreeSet;</span></a>
  439. <a class="sourceLine" id="cb9-5" data-line-number="5"></a>
  440. <a class="sourceLine" id="cb9-6" data-line-number="6"><span class="kw">public</span> <span class="kw">class</span> ExempleSet {</a>
  441. <a class="sourceLine" id="cb9-7" data-line-number="7"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
  442. <a class="sourceLine" id="cb9-8" data-line-number="8"> <span class="bu">Set</span>&lt;<span class="bu">Integer</span>&gt; entiers = <span class="kw">new</span> <span class="bu">TreeSet</span>&lt;&gt;();</a>
  443. <a class="sourceLine" id="cb9-9" data-line-number="9"> entiers.<span class="fu">add</span>(<span class="dv">1</span>);</a>
  444. <a class="sourceLine" id="cb9-10" data-line-number="10"> entiers.<span class="fu">add</span>(<span class="dv">2</span>);</a>
  445. <a class="sourceLine" id="cb9-11" data-line-number="11"> entiers.<span class="fu">add</span>(<span class="dv">3</span>);</a>
  446. <a class="sourceLine" id="cb9-12" data-line-number="12"> entiers.<span class="fu">add</span>(<span class="dv">2</span>);</a>
  447. <a class="sourceLine" id="cb9-13" data-line-number="13"> entiers.<span class="fu">add</span>(<span class="dv">3</span>);</a>
  448. <a class="sourceLine" id="cb9-14" data-line-number="14"> entiers.<span class="fu">add</span>(<span class="dv">4</span>);</a>
  449. <a class="sourceLine" id="cb9-15" data-line-number="15"> entiers.<span class="fu">remove</span>(<span class="dv">3</span>);</a>
  450. <a class="sourceLine" id="cb9-16" data-line-number="16"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(entiers);</a>
  451. <a class="sourceLine" id="cb9-17" data-line-number="17"> }</a>
  452. <a class="sourceLine" id="cb9-18" data-line-number="18">}</a></code></pre></div>
  453. <h3 id="sous-types">Sous-types</h3>
  454. <ul>
  455. <li><code>TreeSet</code>
  456. <ul>
  457. <li>Un <code>Set</code> dont les éléments sont ordonnés</li>
  458. <li><code>SortedSet</code></li>
  459. </ul></li>
  460. <li><code>HashSet</code>
  461. <ul>
  462. <li>Un <code>Set</code> dont les éléments ne sont pas ordonnés</li>
  463. </ul></li>
  464. </ul>
  465. <h2 id="queue">Queue</h2>
  466. <h3 id="usage">Usage</h3>
  467. <p>Les sous-classes de l’interface <code>Queue</code> permettent de gérer des files d’attentes (de type FIFO ou LIFO).</p>
  468. <h3 id="méthodes">Méthodes</h3>
  469. <p>Deux façons d’utiliser un objet de type <code>Queue</code></p>
  470. <table>
  471. <thead>
  472. <tr class="header">
  473. <th>Type d’opération</th>
  474. <th>Lance une exception</th>
  475. <th>Renvoie une valeur spéciale</th>
  476. </tr>
  477. </thead>
  478. <tbody>
  479. <tr class="odd">
  480. <td>Insert</td>
  481. <td>add(elem)</td>
  482. <td>offer(elem) </td>
  483. </tr>
  484. <tr class="even">
  485. <td>Remove</td>
  486. <td>remove()</td>
  487. <td>poll() </td>
  488. </tr>
  489. <tr class="odd">
  490. <td>Examine</td>
  491. <td>element()</td>
  492. <td>peek() </td>
  493. </tr>
  494. </tbody>
  495. </table>
  496. <h3 id="exemple-2">Exemple</h3>
  497. <div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.collections;</span></a>
  498. <a class="sourceLine" id="cb10-2" data-line-number="2"></a>
  499. <a class="sourceLine" id="cb10-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.util.LinkedList;</span></a>
  500. <a class="sourceLine" id="cb10-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.util.Queue;</span></a>
  501. <a class="sourceLine" id="cb10-5" data-line-number="5"></a>
  502. <a class="sourceLine" id="cb10-6" data-line-number="6"><span class="kw">public</span> <span class="kw">class</span> ExempleQueue {</a>
  503. <a class="sourceLine" id="cb10-7" data-line-number="7"></a>
  504. <a class="sourceLine" id="cb10-8" data-line-number="8"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
  505. <a class="sourceLine" id="cb10-9" data-line-number="9"> <span class="dt">int</span> nombreClients = <span class="dv">0</span> ;</a>
  506. <a class="sourceLine" id="cb10-10" data-line-number="10"> <span class="bu">Queue</span>&lt;<span class="bu">String</span>&gt; queue = <span class="kw">new</span> <span class="bu">LinkedList</span>&lt;&gt;();</a>
  507. <a class="sourceLine" id="cb10-11" data-line-number="11"></a>
  508. <a class="sourceLine" id="cb10-12" data-line-number="12"> <span class="kw">while</span> (nombreClients &lt; <span class="dv">10</span>){</a>
  509. <a class="sourceLine" id="cb10-13" data-line-number="13"> queue.<span class="fu">add</span>(<span class="st">&quot;Client(&quot;</span>+nombreClients+<span class="st">&quot;)&quot;</span>);</a>
  510. <a class="sourceLine" id="cb10-14" data-line-number="14"> nombreClients++;</a>
  511. <a class="sourceLine" id="cb10-15" data-line-number="15"> }</a>
  512. <a class="sourceLine" id="cb10-16" data-line-number="16"></a>
  513. <a class="sourceLine" id="cb10-17" data-line-number="17"> <span class="kw">while</span> (!queue.<span class="fu">isEmpty</span>()) {</a>
  514. <a class="sourceLine" id="cb10-18" data-line-number="18"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(queue.<span class="fu">remove</span>());</a>
  515. <a class="sourceLine" id="cb10-19" data-line-number="19"> }</a>
  516. <a class="sourceLine" id="cb10-20" data-line-number="20"> }</a>
  517. <a class="sourceLine" id="cb10-21" data-line-number="21">}</a></code></pre></div>
  518. <h1 id="linterface-map-et-ses-sous-classes">L’interface Map et ses sous-classes</h1>
  519. <h2 id="association-clef-valeur">Association clef-valeur</h2>
  520. <p>Une <code>Map</code> permet de stocker des éléments en les référençant via une clef d’accès.</p>
  521. <p>C’est l’équivalent d’un dictionnaire. Pour trouver la définition d’un mot, on cherche le mot en question. Une fois trouvé, il est possible d’en lire la définition.</p>
  522. <p>L’utilisation des <code>Map</code> permet de stocker et récupérer facilement une information, un pointeur ou un objet associé à un autre objet.</p>
  523. <h2 id="types-des-clefs-et-des-valeurs">Types des clefs et des valeurs</h2>
  524. <p>Une <code>Map</code> va associer</p>
  525. <ul>
  526. <li>une clef
  527. <ul>
  528. <li>instance d’un objet ayant un certain type (par exemple <code>Date</code>)</li>
  529. </ul></li>
  530. <li>avec une valeur
  531. <ul>
  532. <li>instance d’un objet d’un autre type : par exemple <code>Personne</code></li>
  533. </ul></li>
  534. <li>Utilisation des Generics
  535. <ul>
  536. <li><code>Map &lt;Date, Personne&gt; personneParAnniversaire</code></li>
  537. </ul></li>
  538. <li>On peut ainsi retrouver une personne à partir de sa date d’anniversaire.</li>
  539. </ul>
  540. <h2 id="exemple-3">Exemple</h2>
  541. <div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.util.Map;</span></a>
  542. <a class="sourceLine" id="cb11-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.util.HashMap;</span></a>
  543. <a class="sourceLine" id="cb11-3" data-line-number="3"></a>
  544. <a class="sourceLine" id="cb11-4" data-line-number="4"><span class="kw">public</span> <span class="kw">class</span> Anniversaire {</a>
  545. <a class="sourceLine" id="cb11-5" data-line-number="5"> <span class="kw">private</span> <span class="bu">Map</span>&lt;<span class="bu">String</span>, Personne&gt; anniv = <span class="kw">new</span> <span class="bu">HashMap</span>&lt;&gt;();</a>
  546. <a class="sourceLine" id="cb11-6" data-line-number="6"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">init</span>(){</a>
  547. <a class="sourceLine" id="cb11-7" data-line-number="7"> anniv.<span class="fu">put</span>(<span class="st">&quot;19/05/1955&quot;</span>, <span class="kw">new</span> <span class="fu">Personne</span>(<span class="st">&quot;Gosling&quot;</span>, <span class="st">&quot;James&quot;</span>));</a>
  548. <a class="sourceLine" id="cb11-8" data-line-number="8"> anniv.<span class="fu">put</span>(<span class="st">&quot;09/09/1941&quot;</span>, <span class="kw">new</span> <span class="fu">Personne</span>(<span class="st">&quot;Ritchie&quot;</span>, <span class="st">&quot;Dennis&quot;</span>));</a>
  549. <a class="sourceLine" id="cb11-9" data-line-number="9"> anniv.<span class="fu">put</span>(<span class="st">&quot;04/02/1943&quot;</span>, <span class="kw">new</span> <span class="fu">Personne</span>(<span class="st">&quot;Thompson&quot;</span>, <span class="st">&quot;Ken&quot;</span>));</a>
  550. <a class="sourceLine" id="cb11-10" data-line-number="10"> }</a>
  551. <a class="sourceLine" id="cb11-11" data-line-number="11"></a>
  552. <a class="sourceLine" id="cb11-12" data-line-number="12"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">affichePrenom</span>(<span class="bu">String</span> date){</a>
  553. <a class="sourceLine" id="cb11-13" data-line-number="13"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(anniv.<span class="fu">get</span>(date).<span class="fu">prenom</span>);</a>
  554. <a class="sourceLine" id="cb11-14" data-line-number="14"> }</a>
  555. <a class="sourceLine" id="cb11-15" data-line-number="15"></a>
  556. <a class="sourceLine" id="cb11-16" data-line-number="16"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
  557. <a class="sourceLine" id="cb11-17" data-line-number="17"> Anniversaire a = <span class="kw">new</span> <span class="fu">Anniversaire</span>();</a>
  558. <a class="sourceLine" id="cb11-18" data-line-number="18"> a.<span class="fu">init</span>();</a>
  559. <a class="sourceLine" id="cb11-19" data-line-number="19"> a.<span class="fu">affichePrenom</span>(<span class="st">&quot;04/02/1943&quot;</span>);</a>
  560. <a class="sourceLine" id="cb11-20" data-line-number="20"> }</a>
  561. <a class="sourceLine" id="cb11-21" data-line-number="21">}</a>
  562. <a class="sourceLine" id="cb11-22" data-line-number="22"></a>
  563. <a class="sourceLine" id="cb11-23" data-line-number="23"><span class="kw">class</span> Personne{</a>
  564. <a class="sourceLine" id="cb11-24" data-line-number="24"> <span class="bu">String</span> nom;</a>
  565. <a class="sourceLine" id="cb11-25" data-line-number="25"> <span class="bu">String</span> prenom;</a>
  566. <a class="sourceLine" id="cb11-26" data-line-number="26"> <span class="fu">Personne</span>(<span class="bu">String</span> nom, <span class="bu">String</span> prenom){</a>
  567. <a class="sourceLine" id="cb11-27" data-line-number="27"> <span class="kw">this</span>.<span class="fu">nom</span> = nom;</a>
  568. <a class="sourceLine" id="cb11-28" data-line-number="28"> <span class="kw">this</span>.<span class="fu">prenom</span> = prenom;</a>
  569. <a class="sourceLine" id="cb11-29" data-line-number="29"> }</a>
  570. <a class="sourceLine" id="cb11-30" data-line-number="30">}</a></code></pre></div>
  571. <h2 id="classes-de-type-map">Classes de type Map</h2>
  572. <p>On peut utiliser à la place de <code>HashMap</code> un type <code>TreeMap</code> ou <code>EnumMap</code> ainsi que d’autres classes (voir la <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html">Javadoc correspondante</a>)</p>
  573. <p>Les différences d’implémentation entre ces différentes classes ne seront pas discutées ici.</p>
  574. <h1 id="parcours">Parcours</h1>
  575. <h2 id="interface-iterator">Interface Iterator</h2>
  576. <p>Parmi les fonctionnalités communes aux collections, il y a la possibilité de parcourir la liste des éléments d’une collection via l’interface <code>Iterator</code>.</p>
  577. <h2 id="cas-particulier-map">Cas particulier: Map</h2>
  578. <p><code>Map</code> est ici un peu à part. Elle est liée aux collections dans le fait qu’elle possède deux méthodes qui renvoient des instances de l’interface <code>Set</code>:</p>
  579. <ul>
  580. <li><code>Set&lt;K&gt; keySet()</code>: ensemble des clefs</li>
  581. <li><code>Set&lt;Map.Entry&lt;K,V&gt;&gt; entrySet()</code> : ensemble des entrées</li>
  582. </ul>
  583. <p>À partir de ces instances de <code>Set</code> il est possible de récupérer un <code>Iterator</code> pour en parcourir les éléments de la <code>Map</code>.</p>
  584. <h2 id="iterator">Iterator</h2>
  585. <h3 id="exemple-de-parcours">Exemple de parcours</h3>
  586. <p>Voici un exemple d’utilisation d’un <code>Iterator</code>. Ceci est applicable à toute sous-interface de <code>Collection</code>:</p>
  587. <div class="sourceCode" id="cb12"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb12-1" data-line-number="1"></a>
  588. <a class="sourceLine" id="cb12-2" data-line-number="2"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">parcourir</span>(<span class="bu">Collection</span> collection) {</a>
  589. <a class="sourceLine" id="cb12-3" data-line-number="3"> <span class="bu">Iterator</span> it = collection.<span class="fu">iterator</span>();</a>
  590. <a class="sourceLine" id="cb12-4" data-line-number="4"></a>
  591. <a class="sourceLine" id="cb12-5" data-line-number="5"> <span class="kw">while</span>(it.<span class="fu">hasNext</span>()) {</a>
  592. <a class="sourceLine" id="cb12-6" data-line-number="6"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(it.<span class="fu">next</span>());</a>
  593. <a class="sourceLine" id="cb12-7" data-line-number="7"> }</a>
  594. <a class="sourceLine" id="cb12-8" data-line-number="8"> }</a></code></pre></div>
  595. <h3 id="parcours-avec-for-et-for-each">Parcours avec for et for-each</h3>
  596. <div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.collections;</span></a>
  597. <a class="sourceLine" id="cb13-2" data-line-number="2"></a>
  598. <a class="sourceLine" id="cb13-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.util.Iterator;</span></a>
  599. <a class="sourceLine" id="cb13-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.util.Set;</span></a>
  600. <a class="sourceLine" id="cb13-5" data-line-number="5"><span class="kw">import</span><span class="im"> java.util.TreeSet;</span></a>
  601. <a class="sourceLine" id="cb13-6" data-line-number="6"></a>
  602. <a class="sourceLine" id="cb13-7" data-line-number="7"><span class="kw">public</span> <span class="kw">class</span> ExempleIteration {</a>
  603. <a class="sourceLine" id="cb13-8" data-line-number="8"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
  604. <a class="sourceLine" id="cb13-9" data-line-number="9"> <span class="bu">Set</span>&lt;<span class="bu">Integer</span>&gt; entiers = <span class="kw">new</span> <span class="bu">TreeSet</span>&lt;&gt;();</a>
  605. <a class="sourceLine" id="cb13-10" data-line-number="10"> entiers.<span class="fu">add</span>(<span class="dv">1</span>);</a>
  606. <a class="sourceLine" id="cb13-11" data-line-number="11"> entiers.<span class="fu">add</span>(<span class="dv">2</span>);</a>
  607. <a class="sourceLine" id="cb13-12" data-line-number="12"> entiers.<span class="fu">add</span>(<span class="dv">3</span>);</a>
  608. <a class="sourceLine" id="cb13-13" data-line-number="13"> entiers.<span class="fu">add</span>(<span class="dv">4</span>);</a>
  609. <a class="sourceLine" id="cb13-14" data-line-number="14"> entiers.<span class="fu">remove</span>(<span class="dv">3</span>);</a>
  610. <a class="sourceLine" id="cb13-15" data-line-number="15"> entiers.<span class="fu">add</span>(<span class="dv">16</span>);</a>
  611. <a class="sourceLine" id="cb13-16" data-line-number="16"> entiers.<span class="fu">add</span>(<span class="dv">8</span>);</a>
  612. <a class="sourceLine" id="cb13-17" data-line-number="17"></a>
  613. <a class="sourceLine" id="cb13-18" data-line-number="18"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;For sur Iterator&quot;</span>);</a>
  614. <a class="sourceLine" id="cb13-19" data-line-number="19"> <span class="kw">for</span> (<span class="bu">Iterator</span>&lt;<span class="bu">Integer</span>&gt; iterator = entiers.<span class="fu">iterator</span>(); iterator.<span class="fu">hasNext</span>();) {</a>
  615. <a class="sourceLine" id="cb13-20" data-line-number="20"> <span class="bu">Integer</span> entier = iterator.<span class="fu">next</span>();</a>
  616. <a class="sourceLine" id="cb13-21" data-line-number="21"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(entier);</a>
  617. <a class="sourceLine" id="cb13-22" data-line-number="22"> }</a>
  618. <a class="sourceLine" id="cb13-23" data-line-number="23"></a>
  619. <a class="sourceLine" id="cb13-24" data-line-number="24"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;For-each&quot;</span>);</a>
  620. <a class="sourceLine" id="cb13-25" data-line-number="25"> <span class="kw">for</span> (<span class="bu">Integer</span> entier : entiers) {</a>
  621. <a class="sourceLine" id="cb13-26" data-line-number="26"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(entier);</a>
  622. <a class="sourceLine" id="cb13-27" data-line-number="27"> }</a>
  623. <a class="sourceLine" id="cb13-28" data-line-number="28"> }</a>
  624. <a class="sourceLine" id="cb13-29" data-line-number="29">}</a></code></pre></div>
  625. <h1 id="application">Application</h1>
  626. <h2 id="list-création-de-listes-de-véhicules">List : création de listes de véhicules</h2>
  627. <p>Nous allons cette fois gérer des listes de <code>Vehicule</code> (en créant une nouvelle classe <code>Vehicule</code> dans le paquet <code>com.example.gestionflotte</code>).</p>
  628. <p>Cette classe comportera les attributs permettants de stocker les informations suivantes:</p>
  629. <ul>
  630. <li>marque</li>
  631. <li>modèle</li>
  632. <li>identifiant (un entier dont la valeur est distincte pour chaque instance de la classe véhicule)</li>
  633. </ul>
  634. <p>D’un point de vue administratif, une personne (physique ou morale) est propriétaire d’un ou plusieurs véhicules. Ces véhicules peuvent être des types suivants (le nombre de type est ici limité pour simplifier le programme) :</p>
  635. <ul>
  636. <li>Véhicule Léger (automobile)</li>
  637. <li>Véhicule de transport de personnes (plus de huit places assises)</li>
  638. </ul>
  639. <p>Une entreprise doit gérer une flotte de véhicule ayant ces différents types.</p>
  640. <p>Pour chacun des points demandés, tester le code à partir la méthode <code>main</code> de la classe <code>GestionFlotte</code> créée plus bas.</p>
  641. <div class="warning">
  642. <p><strong>Il n’est pas demandé de gérer l’ajout ou l’affichage par des commandes au clavier</strong>.</p>
  643. <p>Le test du programme se fera en ajoutant “en dur” différents véhicules et en examinant la sortie (console) qu’il fournit.</p>
  644. <p>Le programme doit s’exécuter entièrement automatiquement et afficher des messages sur chaque instruction en cours d’exécution.</p>
  645. </div>
  646. <p>Création des types de véhicules</p>
  647. <ol type="1">
  648. <li>Créer la classe <code>Vehicule</code> et faite en sorte qu’un identifiant unique soit associé à chaque nouvelle instance.</li>
  649. <li>Créer une classe pour chaque type (<code>VehiculeLeger</code>, <code>VehiculeLourd</code>, <code>VehiculeTransportPassagers</code>)</li>
  650. <li>Pour la classe <code>VehiculeTransportPassagers</code>, ajouter un attribut indiquant le nombre maximal de passagers nommé <code>nombreMaxPassagers</code></li>
  651. <li>Pour la classe <code>VehiculeLeger</code>, indiquer le type: entreprise (voiture à deux places), utilitaire ou particulier (véhicule à 5 places).</li>
  652. <li>Redéfinir la méthode <code>equals</code> qui permet de vérifier si deux véhicules sont identiques (même marque, même modèle). Ils peuvent avoir des identifiants différents.</li>
  653. <li>Implémenter la méthode <code>toString</code> de la classe véhicule pour afficher l’identifiant, la marque et le modèle sous cette forme: <code>&quot;[134,marque,modèle]&quot;</code></li>
  654. </ol>
  655. <p>On souhaite pouvoir gérer les listes suivantes:</p>
  656. <ul>
  657. <li>liste de tous les véhicules appartenant à l’entreprise: <code>listeGlobale</code></li>
  658. <li>liste de tous les véhicules de transports de passagers: <code>listeTransportPassagers</code></li>
  659. <li>liste de tous les véhicules légers: <code>listeVehiculesLegers</code></li>
  660. </ul>
  661. <p>La classe <code>GestionFlotte</code> va comporter une méthode <code>main</code>.</p>
  662. <ol start="7" type="1">
  663. <li>Cans la classe <code>GestionFlotte</code>, ajouter ces trois listes. Il ne doit pas être possible d’ajouter un type incorrect dans les différentes listes (pas de Véhicule Léger dans la liste des véhicules de transport de passagers).</li>
  664. <li>Ajouter une méthode permettant d’ajouter un véhicule quelconque dans la liste globale: <code>ajouterVehicule(Vehicule v)</code></li>
  665. <li>Ajouter une méthode permettant de supprimer un véhicule de la liste globale: <code>supprimerVehicule(Vehicule v)</code></li>
  666. <li>Ajouter une méthode indiquant le nombre de véhicules dans la liste globale : <code>getNombreVehicules()</code></li>
  667. <li>Tester le code en ajoutant puis supprimant plusieurs véhicules et en vérifiant si les valeur renvoyées sont cohérentes</li>
  668. </ol>
  669. <h2 id="list-affichage-dune-liste-de-véhicules">List: affichage d’une liste de véhicules</h2>
  670. <p>Dans cette partie, il s’agit d’afficher les listes de véhicules sous forme de chaînes de caractères.</p>
  671. <ol start="12" type="1">
  672. <li>Créer une méthode permettant de récupérer sous forme de chaîne de caractère l’ensemble des véhicules pour chaque type (trois méthodes à créer):</li>
  673. </ol>
  674. <pre><code>- `getListeInformationsTousVehicules()`
  675. - `getListeInformationsVehiculesLegers()`
  676. - `getListeInformationsVehiculesTransportsPassagers()`</code></pre>
  677. <ol start="13" type="1">
  678. <li>Ajouter une méthode permettant de remplir automatiquement les deux listes spécialisées à partir de la liste globale. Un élément déjà présent dans une liste ne doit pas être ajouté.</li>
  679. </ol>
  680. <pre><code>- `synchroniserListesSpecialisees()`</code></pre>
  681. <ol start="14" type="1">
  682. <li>Faire en sorte que tout ajout de véhicule dans la flotte complète automatiquement les listes spécialisées si elles sont concernées (à chaque appel de la méthode <code>ajouterVehicule(Vehicule v)</code>).</li>
  683. <li>Tester avec au moins deux instances pour chaque type de véhicule.</li>
  684. </ol>
  685. <h2 id="queue-et-set">(Queue et Set)</h2>
  686. <p>Reprendre les classes permettant la gestion d’une flotte de véhicules (<code>GestionFlotte</code>).</p>
  687. <ol start="16" type="1">
  688. <li>Ajouter à la classe <code>GestionFlotte</code> un attribut <code>marquesVehicules</code> de type <code>Set</code> donnant l’ensemble des marques de véhicules gérés par <code>GestionFlotte</code>.</li>
  689. </ol>
  690. <pre><code>```java
  691. Set&lt;String&gt; marquesVehicules = new HashSet&lt;&gt;();
  692. ```</code></pre>
  693. <ol start="17" type="1">
  694. <li>Créer une méthode <code>void syncMarquesVehicules()</code> permettant de remplir cet ensemble à partir de la liste de tous les véhicules (<code>listeGlobale</code>).</li>
  695. <li>Créer une méthode <code>String getListeMarquesVehicules()</code> qui renvoie une chaîne de caractères représentant les données contenues dans <code>marquesVehicules</code> (exemple: <code>&quot;Mercedes,Toyota,Peugeot&quot;</code>)</li>
  696. <li>Ajouter à la classe <code>GestionFlotte</code> un attribut <code>modelesVehicule</code> de type <code>Set</code> qui permet de gérer l’ensemble des marques et modèles de véhicule (un modèle de véhicule pouvant être présent plusieurs fois dans <code>listeGlobale</code>).</li>
  697. <li>Créer une méthode <code>syncModelesVehicules</code> qui permet de remplir automatiquement <code>modelesVehicule</code> (lire la documentation de <code>Set.addAll(Collection)</code> et souvenez-vous de l’implémentation de la méthode <code>equals</code>)</li>
  698. <li>Créer une méthode <code>String getListeModelesVehicules()</code> qui renvoie une chaîne de caractères représentant les données contenues dans <code>modelesVehicule</code> (exemple: <code>&quot;[Mercedes/Classe A],[Toyota/Prius],[Toyota/Yaris],[Peugeot/Partner]&quot;</code>)</li>
  699. </ol>
  700. <h2 id="map-référencement-de-véhicule">Map : référencement de véhicule</h2>
  701. <p>Dans ce qui suit, vous traiterez les cas d’erreurs avec des exceptions (pour lesquelles vous créerez des classes).</p>
  702. <p>Dans cette partie, nous allons références les véhicules par leur identifiant.</p>
  703. <ol start="22" type="1">
  704. <li>Créer une <code>Map</code> permettant de stocker la liste des véhicules en les référençant par leur identifiant.</li>
  705. </ol>
  706. <ul>
  707. <li><p>quel est le type de l’identifiant ?</p>
  708. <ol start="23" type="1">
  709. <li>Créer une méthode permettant de récupérer un véhicule à partir de son identifiant: <code>getVehicule(int id)</code></li>
  710. <li>Créer une <code>Map</code> permettant de classer les véhicules par constructeur (marque).</li>
  711. </ol></li>
  712. <li><p>quel doit être le type de la clef ?</p>
  713. <ol start="25" type="1">
  714. <li>Créer une méthode permettant de récupérer une chaîne de caractères représentant la liste des véhicules pour un constructeur passé en paramètres: <code>getListeVehiculePourMarque(...)</code></li>
  715. <li>Faites en sorte de rendre cohérent le contenu de ses <code>Map</code> avec celui des listes de véhicules (à chaque ajout et/ou via une méthode de synchronisation)</li>
  716. </ol></li>
  717. <li><p>quelle manière semble la plus appropriée ?</p></li>
  718. </ul>
  719. <h2 id="iterator-application">Iterator: application</h2>
  720. <p>Utilisez un Iterator pour afficher l’ensemble des éléments de la liste des véhicules légers.</p>
  721. </body>
  722. </html>