1 00:00:00,000 --> 00:00:01,179 Cosita antes de irnos. 2 00:00:02,540 --> 00:00:03,000 Vale. 3 00:00:04,580 --> 00:00:09,599 Pues nada, porcentaje de alumnos, ya que estábamos, incluimos esta funcionalidad y seguimos repasando. 4 00:00:10,300 --> 00:00:13,820 Pues nada, porcentaje de alumnos, he contado los aprobados. 5 00:00:14,480 --> 00:00:21,039 Y para ver el porcentaje de aprobados, pues ahora ya tenemos que hacer la regla de 3 hasta 100, ¿no? 6 00:00:21,039 --> 00:00:24,179 El porcentaje de aprobados sería 7 00:00:24,179 --> 00:00:29,579 Sería 8 00:00:29,579 --> 00:00:30,960 El total 9 00:00:30,960 --> 00:00:33,619 Multiplicado por 10 00:00:33,619 --> 00:00:35,920 O sea, el total de aprobados 11 00:00:35,920 --> 00:00:37,859 Multiplicado por el total dividido entre 100 12 00:00:37,859 --> 00:00:38,079 ¿No? 13 00:00:39,179 --> 00:00:40,859 No sé si estoy haciendo bien la regla de 3 14 00:00:40,859 --> 00:00:43,859 El total sería alumnos.led 15 00:00:43,859 --> 00:00:44,679 No, no, perdón 16 00:00:44,679 --> 00:00:46,579 Este entre 17 00:00:46,579 --> 00:00:48,859 El total multiplicado por 100 18 00:00:48,859 --> 00:00:50,039 Ese sería el porcentaje 19 00:00:50,039 --> 00:00:52,719 Alumnos.led 20 00:00:52,719 --> 00:00:54,600 hay repositorio alumnos, perdón 21 00:00:54,600 --> 00:01:02,520 punto alumnos y todo esto 22 00:01:02,520 --> 00:01:03,700 multiplicado por 100 23 00:01:03,700 --> 00:01:05,920 ala 24 00:01:05,920 --> 00:01:10,439 punto alumnos, punto lens 25 00:01:10,439 --> 00:01:12,700 ala, ya está 26 00:01:12,700 --> 00:01:14,480 vale, este sería 27 00:01:14,480 --> 00:01:15,840 el porcentaje de aprobados, ¿no? 28 00:01:17,099 --> 00:01:18,000 que es 29 00:01:18,000 --> 00:01:20,500 mis aprobados entre los totales 30 00:01:20,500 --> 00:01:21,920 multiplicado por 100 31 00:01:21,920 --> 00:01:25,319 mis aprobados que es 32 00:01:25,319 --> 00:01:27,700 entre los totales 33 00:01:27,700 --> 00:01:28,920 lo voy a bajar aquí abajo 34 00:01:28,920 --> 00:01:30,620 lo del paréntesis 35 00:01:30,620 --> 00:01:33,799 para que se vea. 36 00:01:34,420 --> 00:01:35,640 Mis aprobados 37 00:01:35,640 --> 00:01:37,599 entre el total de alumnos 38 00:01:37,599 --> 00:01:39,579 que tengo, el total de alumnos 39 00:01:39,579 --> 00:01:41,819 multiplicado por 100. 40 00:01:41,900 --> 00:01:42,879 Ese es el porcentaje aprobado. 41 00:01:43,079 --> 00:01:45,480 Pues nada, funcionalidad por hacer alguna cosita más. 42 00:01:45,560 --> 00:01:47,120 Que no se quede la aplicación ahí tan 43 00:01:47,120 --> 00:01:48,180 cortita. 44 00:01:50,000 --> 00:01:51,840 Vale, ya habríamos terminado el caso 2. 45 00:01:52,040 --> 00:01:53,200 Le hacemos el break. 46 00:01:54,900 --> 00:01:55,719 Caso 3. 47 00:01:56,120 --> 00:01:57,000 Mostrar el listado. 48 00:01:57,299 --> 00:01:58,459 Este es un for que recorra. 49 00:01:58,920 --> 00:02:00,379 nada 50 00:02:00,379 --> 00:02:03,480 el caso 3 51 00:02:03,480 --> 00:02:05,579 pues ahora ya esto sí que podemos hacer un for 52 00:02:05,579 --> 00:02:06,400 ahí cómodo 53 00:02:06,400 --> 00:02:09,180 para cada alumno 54 00:02:09,180 --> 00:02:11,539 en mi array de alumnos 55 00:02:11,539 --> 00:02:14,780 repositorio.alumnos 56 00:02:14,780 --> 00:02:20,259 mostramos 57 00:02:20,259 --> 00:02:24,300 vamos a mostrar el nombre y la nota 58 00:02:24,300 --> 00:02:25,639 en el listado 59 00:02:25,639 --> 00:02:29,050 nombre 60 00:02:29,050 --> 00:02:35,669 apunto get nota 61 00:02:35,669 --> 00:02:42,069 vale, el listado que tenga solamente eso 62 00:02:42,069 --> 00:02:49,449 Nombre y nota, por ejemplo 63 00:02:49,449 --> 00:02:50,469 ¿Vale? Nombre y nota 64 00:02:50,469 --> 00:02:54,229 Y ahora ya tendríamos el caso 4 65 00:02:54,229 --> 00:02:55,830 Que es el 66 00:02:55,830 --> 00:03:00,210 Que ha motivado toda esta pequeña aplicación 67 00:03:00,210 --> 00:03:04,050 Vamos a dejarlo en su vacío 68 00:03:04,050 --> 00:03:06,030 Y vamos a probar la aplicación antes de nada 69 00:03:06,030 --> 00:03:08,550 Para ver si hemos hecho algo mal 70 00:03:08,550 --> 00:03:11,449 Vamos a probarla antes de nada 71 00:03:11,449 --> 00:03:15,460 Pues nada, ya nos venden la aplicación 72 00:03:15,460 --> 00:03:17,080 Salvo por una funcionalidad que está por hacer 73 00:03:17,080 --> 00:03:18,599 Ordenar por nota, ya nos la han vendido 74 00:03:18,599 --> 00:03:21,560 Vamos a probarla a ver si nos la han hecho bien 75 00:03:21,560 --> 00:03:23,879 Venga, introduce un alumno 76 00:03:23,879 --> 00:03:25,539 Pues aún no va a ser un 2, 3, 4 77 00:03:25,539 --> 00:03:28,199 Vale, se va a llamar Pepito 78 00:03:28,199 --> 00:03:29,280 Y va a tener un 7 79 00:03:29,280 --> 00:03:31,180 Pues nos lo han hecho fatal 80 00:03:31,180 --> 00:03:32,879 Porque nos ha sido una excepción 81 00:03:32,879 --> 00:03:34,939 ¿No? 82 00:03:35,520 --> 00:03:37,419 Pues yo desde luego algo he hecho mal 83 00:03:37,419 --> 00:03:39,539 Se me ha salido del array 84 00:03:39,539 --> 00:03:42,159 ¿Dónde se me ha salido del array? 85 00:03:42,280 --> 00:03:43,240 Me voy aquí 86 00:03:43,240 --> 00:03:45,900 aux.led 87 00:03:45,900 --> 00:03:47,560 menos 1 igual a 88 00:03:47,560 --> 00:03:49,979 Aquí, es que yo esto no lo he puesto así 89 00:03:49,979 --> 00:03:52,199 Esto se me había olvidado a mí 90 00:03:52,199 --> 00:03:53,740 ¿Vale? 91 00:03:53,759 --> 00:03:55,780 Lo que hemos hecho así todo seguido se me había olvidado eso 92 00:03:55,780 --> 00:03:59,889 Vale, que a vosotros seguramente no 93 00:03:59,889 --> 00:04:01,509 Y por eso nos ha dado problemas, pero a mí se 94 00:04:01,509 --> 00:04:03,650 Venga, pues volvemos 95 00:04:03,650 --> 00:04:05,409 A ejecutar la aplicación, a ver si ahora 96 00:04:05,409 --> 00:04:06,830 Esto que me han vendido funciona 97 00:04:06,830 --> 00:04:09,189 Ah, le vamos a entrar a un alumno 98 00:04:09,189 --> 00:04:10,490 Pues venga 99 00:04:10,490 --> 00:04:12,870 Este es su NIF 100 00:04:12,870 --> 00:04:14,909 Este es su nombre 101 00:04:14,909 --> 00:04:16,629 Y esta es su nota 102 00:04:16,629 --> 00:04:19,029 Vamos a insertar otro, a ver 103 00:04:19,029 --> 00:04:26,560 Ah, no, es que le he dado a la opción 2 104 00:04:26,560 --> 00:04:28,720 2 me dice porcentaje de aprobados 100% 105 00:04:28,720 --> 00:04:29,839 Parece que está funcionando 106 00:04:29,839 --> 00:04:31,800 Vamos a insertar otro 107 00:04:31,800 --> 00:04:34,579 Que este esté suspenso, a ver si ahora me sale porcentaje 50 108 00:04:34,579 --> 00:04:36,980 2, 2, 2 109 00:04:36,980 --> 00:04:37,459 Vale 110 00:04:37,459 --> 00:04:40,319 Y esta tiene un 3 111 00:04:40,319 --> 00:04:43,079 A ver qué porcentaje de aprobados me sale 112 00:04:43,079 --> 00:04:46,480 Porcentaje de aprobados 0 113 00:04:46,480 --> 00:04:47,060 Uff 114 00:04:47,060 --> 00:04:49,379 Me tendría que salir 50, ¿verdad? 115 00:04:54,290 --> 00:04:55,750 Vamos a mostrar el listado 116 00:04:55,750 --> 00:05:00,019 Pepito 7, Anita 3 117 00:05:00,019 --> 00:05:02,139 entonces el porcentaje de aprobados 118 00:05:02,139 --> 00:05:03,800 no me lo está haciendo bien, porque tiene 119 00:05:03,800 --> 00:05:05,199 Pepito 7, Anita 3 120 00:05:05,199 --> 00:05:07,939 y cuando yo doy porcentaje de aprobado 121 00:05:07,939 --> 00:05:09,740 me dice 0, entonces ese cálculo 122 00:05:09,740 --> 00:05:11,259 esa cuenta, algo ahí he hecho mal 123 00:05:11,259 --> 00:05:13,639 a lo mejor tiene que ver con los castings de Inde 124 00:05:13,639 --> 00:05:15,839 de Abel, por ahí pueden ir 125 00:05:15,839 --> 00:05:17,740 las cosas, cuidadín 126 00:05:17,740 --> 00:05:19,259 cuando hacemos divisiones 127 00:05:19,259 --> 00:05:20,199 cuidadín 128 00:05:20,199 --> 00:05:23,579 porque la división uno siempre 129 00:05:23,579 --> 00:05:25,519 interpreta que va a tener 130 00:05:25,519 --> 00:05:27,100 su parte decimal, pero no 131 00:05:27,100 --> 00:05:28,920 Si involucra números enteros 132 00:05:28,920 --> 00:05:30,379 La parte decimal ahí no cuenta 133 00:05:30,379 --> 00:05:31,860 ¿Vale? Cuidadín 134 00:05:31,860 --> 00:05:33,180 Entonces ahora 135 00:05:33,180 --> 00:05:36,879 El que ha hecho el equipo de pruebas 136 00:05:36,879 --> 00:05:39,079 Le dice, oye, no me has pasado 137 00:05:39,079 --> 00:05:39,680 El test 138 00:05:39,680 --> 00:05:42,019 No ha pasado con éxito 139 00:05:42,019 --> 00:05:44,740 El test del porcentaje de aprobados 140 00:05:44,740 --> 00:05:45,939 No ha pasado con éxito 141 00:05:45,939 --> 00:05:47,519 A ver qué ha pasado 142 00:05:47,519 --> 00:05:51,279 Nos vamos a la funcionalidad de porcentaje de aprobados 143 00:05:51,279 --> 00:05:52,360 Main 144 00:05:52,360 --> 00:05:54,779 Porcentaje de aprobados 145 00:05:54,779 --> 00:05:56,399 ¿Vale? 146 00:05:57,100 --> 00:05:58,139 me va contando 147 00:05:58,139 --> 00:06:03,920 ¿qué pasa? 148 00:06:04,240 --> 00:06:05,160 ¿vale? lo he hecho a propósito 149 00:06:05,160 --> 00:06:06,300 para que no salga esto 150 00:06:06,300 --> 00:06:08,180 adiós 151 00:06:08,180 --> 00:06:09,759 ¿qué ha pasado? 152 00:06:10,579 --> 00:06:11,660 ¿qué peligro tienen 153 00:06:11,660 --> 00:06:14,180 mezclar divisiones y números enteros? 154 00:06:14,600 --> 00:06:15,560 ¿qué peligro tienen? 155 00:06:15,699 --> 00:06:16,399 cuidado con eso 156 00:06:16,399 --> 00:06:19,000 que lo hacemos así muy 157 00:06:19,000 --> 00:06:21,000 cuando yo lo he escrito 158 00:06:21,000 --> 00:06:23,180 parecía que tenía todo el sentido del mundo 159 00:06:23,180 --> 00:06:23,519 ¿verdad? 160 00:06:24,819 --> 00:06:26,660 pero ¿qué está pasando en este ejemplo? 161 00:06:28,420 --> 00:06:30,439 En esta ejecución en concreta que yo he hecho, 162 00:06:31,279 --> 00:06:32,660 repositorio de alunas putuleces dos 163 00:06:32,660 --> 00:06:35,319 y contes uno. 164 00:06:36,379 --> 00:06:38,040 Pero están guardados como int. 165 00:06:39,060 --> 00:06:40,899 Con lo cual, al estar guardados como int, 166 00:06:41,519 --> 00:06:43,160 la división es la división entera. 167 00:06:44,100 --> 00:06:45,319 Acordaos del principio de curso. 168 00:06:45,860 --> 00:06:47,279 Este operador división 169 00:06:47,279 --> 00:06:50,180 tiene dos formas de funcionar. 170 00:06:50,600 --> 00:06:53,199 La división entera y la división decimal. 171 00:06:53,920 --> 00:06:55,860 ¿Cuándo funciona como división entera? 172 00:06:55,860 --> 00:06:58,540 cuando los operadores con los que trabaja son int 173 00:06:58,540 --> 00:07:00,199 en ese caso 174 00:07:00,199 --> 00:07:02,500 trunca la parte decimal completamente 175 00:07:02,500 --> 00:07:04,439 cuando trabaja 176 00:07:04,439 --> 00:07:05,459 como división decimal 177 00:07:05,459 --> 00:07:08,300 cuando los operadores con los que trabaja son double o float 178 00:07:08,300 --> 00:07:10,100 entonces no trunca la parte decimal 179 00:07:10,100 --> 00:07:12,319 en este caso count es int 180 00:07:12,319 --> 00:07:13,180 lo tengo ahí arriba 181 00:07:13,180 --> 00:07:16,459 y repositorio.alumno.length es la longitud 182 00:07:16,459 --> 00:07:17,519 que me la devuelve int 183 00:07:17,519 --> 00:07:19,560 bueno en long pero es entero igual 184 00:07:19,560 --> 00:07:22,319 con lo cual la división es 185 00:07:22,319 --> 00:07:23,420 sin parte decimal 186 00:07:23,420 --> 00:07:27,079 luego 1 entre 2 187 00:07:27,079 --> 00:07:29,240 no es 0,5 188 00:07:29,240 --> 00:07:31,860 como uno puede creer 189 00:07:31,860 --> 00:07:33,879 que es 0,5 y a multiplicar por 100 190 00:07:33,879 --> 00:07:34,779 le sale 50 191 00:07:34,779 --> 00:07:36,040 no es 0,5 192 00:07:36,040 --> 00:07:38,279 1 entre 2, ¿cuánto es? 193 00:07:40,000 --> 00:07:42,000 1 entre 2, división entera, ¿cuánto es? 194 00:07:42,360 --> 00:07:42,620 0 195 00:07:42,620 --> 00:07:45,120 recordad que la división entera es el cociente 196 00:07:45,120 --> 00:07:47,019 pues 1 entre 2 es 0 197 00:07:47,019 --> 00:07:49,779 por eso me dice, oye, 0 por 100 198 00:07:49,779 --> 00:07:50,259 0 199 00:07:50,259 --> 00:07:53,019 entonces cuidado 200 00:07:53,019 --> 00:07:54,819 porque esta tontería a veces 201 00:07:54,819 --> 00:07:57,379 genera muchos problemas en una aplicación 202 00:07:57,379 --> 00:07:59,220 y en este caso 203 00:07:59,220 --> 00:08:00,579 es una cosa muy sencilla 204 00:08:00,579 --> 00:08:03,500 porque nuestra aplicación es cortita 205 00:08:03,500 --> 00:08:04,839 y podemos acotar el problema 206 00:08:04,839 --> 00:08:07,420 pero esto puede estar dentro de un método 207 00:08:07,420 --> 00:08:08,600 que a su vez llama a otro, que a su vez llama a otro 208 00:08:08,600 --> 00:08:11,560 y no tienes ni idea de por qué te estás haciendo mal 209 00:08:11,560 --> 00:08:13,240 y simplemente es 210 00:08:13,240 --> 00:08:15,100 porque estás haciendo una división creyendo que 211 00:08:15,100 --> 00:08:16,360 conservas la parte decimal 212 00:08:16,360 --> 00:08:19,600 y no la conservas porque le estás pasando operadores enteros 213 00:08:19,600 --> 00:08:20,240 ¿vale? 214 00:08:20,259 --> 00:08:23,339 entonces 215 00:08:23,339 --> 00:08:25,800 ¿qué arreglo podríamos hacer aquí? 216 00:08:28,149 --> 00:08:29,310 hay varias posibilidades 217 00:08:29,310 --> 00:08:31,310 cualquiera que se os ocurra 218 00:08:31,310 --> 00:08:35,379 claro, un casting, podríamos hacer un casting 219 00:08:35,379 --> 00:08:37,340 entonces si hacemos un casting 220 00:08:37,340 --> 00:08:38,659 entero 221 00:08:38,659 --> 00:08:41,919 entre, ya con que uno de los dos 222 00:08:41,919 --> 00:08:42,940 sea dable 223 00:08:42,940 --> 00:08:44,480 recordad que entonces 224 00:08:44,480 --> 00:08:47,700 la máquina virtual de Java al otro le hace la promoción 225 00:08:47,700 --> 00:08:48,320 automática 226 00:08:48,320 --> 00:08:51,559 porque llevar de int a dable 227 00:08:51,559 --> 00:08:53,399 no es problema, es poner .000 228 00:08:53,399 --> 00:08:54,500 no cambia información 229 00:08:54,500 --> 00:08:56,899 Sin embargo, llevar de double a int 230 00:08:56,899 --> 00:08:57,700 Claro que es problema 231 00:08:57,700 --> 00:08:59,059 Porque llevar de double a int 232 00:08:59,059 --> 00:09:00,399 Quitas la parte decimal 233 00:09:00,399 --> 00:09:01,620 Luego quitas información 234 00:09:01,620 --> 00:09:04,360 Entonces, si la división entera 235 00:09:04,360 --> 00:09:06,059 Se encuentra un double y un int 236 00:09:06,059 --> 00:09:09,179 Él hace automáticamente la promoción del int 237 00:09:09,179 --> 00:09:10,740 Ya tiene dos double 238 00:09:10,740 --> 00:09:12,940 Y la división se queda como double 239 00:09:12,940 --> 00:09:14,220 Es decir, parte decimal 240 00:09:14,220 --> 00:09:15,379 Y ya está 241 00:09:15,379 --> 00:09:16,879 Podríamos hacer un casting 242 00:09:16,879 --> 00:09:18,620 O podríamos hacer otra cosa 243 00:09:18,620 --> 00:09:20,279 Que es cambiar el orden 244 00:09:20,279 --> 00:09:21,759 Multiplicar primero por 100 245 00:09:21,759 --> 00:09:22,960 Y luego hacer la división 246 00:09:22,960 --> 00:09:26,139 vale, si yo multiplico primero por 100 247 00:09:26,139 --> 00:09:28,059 el numerito, que este 248 00:09:28,059 --> 00:09:29,240 siempre va a ser menor que este 249 00:09:29,240 --> 00:09:32,000 porque esta es una cuenta que se hace 250 00:09:32,000 --> 00:09:33,980 sobre el total, entonces la cuenta siempre va a ser 251 00:09:33,980 --> 00:09:35,980 menor, entonces esto siempre va a ser 0 252 00:09:35,980 --> 00:09:38,019 ese es el problema, que eso siempre va a ser 0 253 00:09:38,019 --> 00:09:38,740 porque cont 254 00:09:38,740 --> 00:09:42,080 siempre va a ser menor o igual que el 255 00:09:42,080 --> 00:09:42,480 total 256 00:09:42,480 --> 00:09:46,019 bueno, pues yo cambio el orden, primero multiplico 257 00:09:46,019 --> 00:09:47,960 cont por 100 y luego ya hago 258 00:09:47,960 --> 00:09:48,559 la división 259 00:09:48,559 --> 00:09:50,379 vale, entonces 260 00:09:50,379 --> 00:09:53,320 ahora ya, si yo cambio 261 00:09:53,320 --> 00:09:55,220 esto, no tengo que hacer casting ni nada 262 00:09:55,220 --> 00:09:57,100 que los casting, a veces uno los ve 263 00:09:57,100 --> 00:09:59,179 cuando uno abre una aplicación y ve, muchas veces hay que hacer 264 00:09:59,179 --> 00:10:01,159 casting porque no hay remedio, no hay más remedio 265 00:10:01,159 --> 00:10:03,240 pero quedan tan feos 266 00:10:03,240 --> 00:10:05,179 porque tienen tanto peligro, que si uno puede 267 00:10:05,179 --> 00:10:06,779 arreglar las cosas de otra manera, pues mejor 268 00:10:06,779 --> 00:10:13,940 .alumnos.length 269 00:10:13,940 --> 00:10:15,360 ala 270 00:10:15,360 --> 00:10:18,220 ahora ya, cont por 100 271 00:10:18,220 --> 00:10:20,220 ¿vale? será mayor 272 00:10:20,220 --> 00:10:21,480 que el total 273 00:10:21,480 --> 00:10:25,519 con lo cual esto 274 00:10:25,519 --> 00:10:28,720 Esta división entera ya no va a ser cero 275 00:10:28,720 --> 00:10:31,100 Eso sí, el porcentaje me va a dar siempre sin decimales 276 00:10:31,100 --> 00:10:32,659 El porcentaje se va a redondear 277 00:10:32,659 --> 00:10:35,179 Si yo quiero que me dé el porcentaje con decimales 278 00:10:35,179 --> 00:10:36,220 Tendría que hacerlo del casting 279 00:10:36,220 --> 00:10:38,220 ¿Vale? Tendría que hacerlo del casting 280 00:10:38,220 --> 00:10:39,960 Lo que más os guste 281 00:10:39,960 --> 00:10:42,899 Yo ahora he puesto esta porque esto quizás es más difícil 282 00:10:42,899 --> 00:10:44,200 De ver que lo otro 283 00:10:44,200 --> 00:10:46,340 Entonces prefiero poner la opción que es más difícil de 284 00:10:46,340 --> 00:10:48,500 Ver para que la 285 00:10:48,500 --> 00:10:49,440 Penséis 286 00:10:49,440 --> 00:10:52,899 Entonces ahora ya decimos, oye ya he visto que ha pasado 287 00:10:52,899 --> 00:10:54,580 ¿Por qué no he pasado el testing? 288 00:10:55,519 --> 00:11:03,840 Venga, ya ha hecho la versión, vuelve, se lo pasas otra vez al equipo de testing y te dice, venga, vamos a volver a hacer la prueba. 289 00:11:05,720 --> 00:11:20,590 Insertar alumno, ala, esta que tiene un 4, vamos a insertar otro más, esta que tiene un 10, vamos a ver porcentaje de aprobados, 50. 290 00:11:20,590 --> 00:11:23,190 vale, a ver, esto es una única prueba 291 00:11:23,190 --> 00:11:25,129 patatera, obviamente habría que hacer 292 00:11:25,129 --> 00:11:26,049 muchas pruebas 293 00:11:26,049 --> 00:11:28,809 porque puede haber casos 294 00:11:28,809 --> 00:11:30,850 para los cuales no funcione, que no hayamos tenido en cuenta 295 00:11:30,850 --> 00:11:32,850 pero bueno, es un programa tan pequeñito 296 00:11:32,850 --> 00:11:34,990 que es que no tiene muchas más 297 00:11:34,990 --> 00:11:37,330 opciones de fallo, pero en condiciones normales 298 00:11:37,330 --> 00:11:39,129 habría que hacer una fase de pruebas 299 00:11:39,129 --> 00:11:39,929 mucho más larga 300 00:11:39,929 --> 00:11:43,070 pero bueno, tiene pinta de que 301 00:11:43,070 --> 00:11:44,649 lo que hemos hecho ahora ya sí que está bien 302 00:11:44,649 --> 00:11:47,129 vamos a mostrar el listado, ya lo hemos probado 303 00:11:47,129 --> 00:11:49,090 antes, Ana tiene un 4 y va a un 10 304 00:11:49,090 --> 00:11:51,470 vale, bueno pero la aplicación está a medias 305 00:11:51,470 --> 00:11:53,190 nos falta mostrar el listado 306 00:11:53,190 --> 00:11:54,049 ordenado por nota 307 00:11:54,049 --> 00:11:56,529 que esta es la interesante 308 00:11:56,529 --> 00:12:01,879 bueno, pues aquí 309 00:12:01,879 --> 00:12:04,700 tenemos que empezar a ordenar el array 310 00:12:04,700 --> 00:12:06,379 empezar a subir 311 00:12:06,379 --> 00:12:08,460 para arriba, para abajo en función de la nota 312 00:12:08,460 --> 00:12:09,899 un pifostio 313 00:12:09,899 --> 00:12:12,120 los algoritmos de ordenación 314 00:12:12,120 --> 00:12:14,019 no son tan sencillos 315 00:12:14,019 --> 00:12:15,840 no son tan sencillos 316 00:12:15,840 --> 00:12:16,740 de hecho 317 00:12:16,740 --> 00:12:19,500 está todo estudiado 318 00:12:19,500 --> 00:12:24,639 y hay varios algoritmos de ordenación ya propuestos y desarrollados 319 00:12:24,639 --> 00:12:27,840 para que tengan la menor complejidad posible. 320 00:12:28,500 --> 00:12:36,299 Porque ordenar una colección de datos no es una destreza de programación fácil. 321 00:12:36,600 --> 00:12:37,480 No es fácil ordenar. 322 00:12:38,620 --> 00:12:39,179 No es fácil. 323 00:12:39,559 --> 00:12:43,799 Entonces se han propuesto varios algoritmos de ordenación. 324 00:12:44,519 --> 00:12:48,700 Está el de la burbuja, que es el más sencillo de programar 325 00:12:48,700 --> 00:12:50,740 pero que tiene demasiadas 326 00:12:50,740 --> 00:12:52,759 iteraciones, está el 327 00:12:52,759 --> 00:12:54,700 quick sort, que es más 328 00:12:54,700 --> 00:12:56,519 complicado de programar, de entender 329 00:12:56,519 --> 00:12:58,539 porque es recursivo, pero tiene menos 330 00:12:58,539 --> 00:13:00,720 iteraciones, ¿vale? hay algoritmos que están 331 00:13:00,720 --> 00:13:02,419 propuestos, si uno busca en wikipedia 332 00:13:02,419 --> 00:13:04,559 donde sea algoritmo de donación, los tienes ahí 333 00:13:04,559 --> 00:13:06,059 todos puestos, con 334 00:13:06,059 --> 00:13:08,340 la complejidad que tiene cada uno 335 00:13:08,340 --> 00:13:10,659 medida la complejidad en número de iteraciones 336 00:13:10,659 --> 00:13:12,779 que da el bucle, cuanto menos mejor 337 00:13:12,779 --> 00:13:14,240 ¿vale? 338 00:13:14,360 --> 00:13:16,500 lo puedes poner, ¿cómo es este algoritmo en java? 339 00:13:17,320 --> 00:13:18,419 no sé si nos dará tiempo 340 00:13:18,419 --> 00:13:20,799 normalmente veíamos esos algoritmos 341 00:13:20,799 --> 00:13:22,419 los programados para entenderlos 342 00:13:22,419 --> 00:13:24,539 porque es una tarea de lógica 343 00:13:24,539 --> 00:13:26,039 y de matemáticas muy interesante 344 00:13:26,039 --> 00:13:28,440 es una cuestión de lógica y de matemáticas 345 00:13:28,440 --> 00:13:30,299 no tiene que dar tiempo este curso 346 00:13:30,299 --> 00:13:31,919 porque tenemos que 347 00:13:31,919 --> 00:13:34,019 acelerar un poco 348 00:13:34,019 --> 00:13:36,720 pero en nuestro problema, ¿qué haríamos? 349 00:13:37,299 --> 00:13:38,159 pues uno podría decir 350 00:13:38,159 --> 00:13:40,500 oye, me voy a buscar uno de esos algoritmos 351 00:13:40,500 --> 00:13:42,899 de ordenación y lo voy a aplicar 352 00:13:42,899 --> 00:13:44,600 lo voy a programar ese algoritmo 353 00:13:44,600 --> 00:13:46,639 para mi array, es una cosa 354 00:13:46,639 --> 00:13:48,620 que podría hacer, y la haría y ya está 355 00:13:48,620 --> 00:13:50,419 se busca un algoritmo 356 00:13:50,419 --> 00:13:51,720 y lo programa 357 00:13:51,720 --> 00:13:53,980 aplicado a este array 358 00:13:53,980 --> 00:13:55,559 y ya los tiene ordenados 359 00:13:55,559 --> 00:13:58,000 pero afortunadamente 360 00:13:58,000 --> 00:14:00,480 la máquina virtual de Java, como ya hemos dicho 361 00:14:00,480 --> 00:14:01,639 nos incorpora una librería 362 00:14:01,639 --> 00:14:03,879 con un montón de cosas ya hechas 363 00:14:03,879 --> 00:14:06,399 cuando tenemos que hacer 364 00:14:06,399 --> 00:14:07,419 el seno de un ángulo 365 00:14:07,419 --> 00:14:10,500 no hacemos nosotros el algoritmo para el seno 366 00:14:10,500 --> 00:14:12,159 del ángulo, tenemos la librería math 367 00:14:12,159 --> 00:14:14,419 que tiene el método sin, que nos hace el seno 368 00:14:14,419 --> 00:14:16,299 y así un montón de cosas 369 00:14:16,299 --> 00:14:18,700 si queremos hacer la potencia de uno 370 00:14:18,700 --> 00:14:19,700 elevado a otro 371 00:14:19,700 --> 00:14:22,620 no nos hacemos cada dos por tres 372 00:14:22,620 --> 00:14:24,480 el bucle que va multiplicando por sí mismo 373 00:14:24,480 --> 00:14:26,580 llamamos al método POU 374 00:14:26,580 --> 00:14:28,200 de la librería MAD que ya lo hace 375 00:14:28,200 --> 00:14:30,759 entonces las clases de la máquina virtual 376 00:14:30,759 --> 00:14:32,559 tienen un montón 377 00:14:32,559 --> 00:14:34,019 de utilidades para hacer cosas 378 00:14:34,019 --> 00:14:36,779 entonces si uno indaga y cotillea 379 00:14:36,779 --> 00:14:38,620 por ahí, pues ve que 380 00:14:38,620 --> 00:14:40,419 porque es lo que uno hace, buscar 381 00:14:40,419 --> 00:14:42,679 buscar que recursos tiene para hacer 382 00:14:42,679 --> 00:14:44,580 cosas, pues ve que 383 00:14:44,580 --> 00:14:46,919 tiene una clase Arrays que está por ahí en algún sitio 384 00:14:46,919 --> 00:14:48,820 y que 385 00:14:48,820 --> 00:14:50,779 esta clase Arrays tiene ahí la bomba 386 00:14:50,779 --> 00:14:52,820 ¿vale? esta clase 387 00:14:52,820 --> 00:14:53,440 Arrays 388 00:14:53,440 --> 00:14:56,100 que está aquí 389 00:14:56,100 --> 00:14:58,539 en el paquete 390 00:14:58,539 --> 00:14:59,159 Java útil 391 00:14:59,159 --> 00:15:02,679 pues en el paquete Java útil está esta clase Arrays 392 00:15:02,679 --> 00:15:04,080 que uno lee aquí lo que tiene 393 00:15:04,080 --> 00:15:06,580 y tiene un montón de 394 00:15:06,580 --> 00:15:08,460 métodos estáticos estupendos para 395 00:15:08,460 --> 00:15:10,360 hacer cosas en general con Arrays 396 00:15:10,360 --> 00:15:12,500 para hacer cosas con Arrays 397 00:15:12,500 --> 00:15:14,120 tiene ahí de todo 398 00:15:14,120 --> 00:15:16,519 vale, pues cuando uno descubre 399 00:15:16,519 --> 00:15:18,240 que existe esa clase, dice, hombre 400 00:15:18,240 --> 00:15:20,519 pues justo 401 00:15:20,519 --> 00:15:22,299 lo que yo quiero hacer es ordenar un array 402 00:15:22,299 --> 00:15:23,779 hacer una cosa con un array 403 00:15:23,779 --> 00:15:26,480 esta clase array que tiene un montón de métodos 404 00:15:26,480 --> 00:15:27,940 estáticos para hacer cosas con array 405 00:15:27,940 --> 00:15:30,279 tendrá precisamente 406 00:15:30,279 --> 00:15:32,460 un método que me ordene 407 00:15:32,460 --> 00:15:33,019 un array 408 00:15:33,019 --> 00:15:36,679 pues uno lo busca y dice, anda pues sí 409 00:15:36,679 --> 00:15:40,620 ahí lo tiene, tiene un método 410 00:15:40,620 --> 00:15:43,299 que se llama sort 411 00:15:43,299 --> 00:15:45,299 entonces 412 00:15:45,299 --> 00:15:48,379 con ese nombre pues obviamente lo que se hace 413 00:15:48,379 --> 00:15:52,480 es ordenar, vosotros pues 414 00:15:52,480 --> 00:15:54,159 que sois bilingües lo tenéis más fácil 415 00:15:54,159 --> 00:15:55,899 ¿vale? 416 00:15:56,200 --> 00:15:57,759 y este método sort 417 00:15:57,759 --> 00:16:00,620 le pasas un array y te lo ordena 418 00:16:00,620 --> 00:16:01,379 eso te dice la 419 00:16:01,379 --> 00:16:04,519 ayuda, el java2 420 00:16:04,519 --> 00:16:06,279 que va con arrays, te dice tú pásame un array 421 00:16:06,279 --> 00:16:08,620 que yo pa pa pa te lo coloco y te lo ordeno 422 00:16:08,620 --> 00:16:13,169 vamos a mostrarlo 423 00:16:13,169 --> 00:16:14,970 ahora después porque nos lo ha ordenado 424 00:16:14,970 --> 00:16:16,710 pero vamos a mostrarlo 425 00:16:16,710 --> 00:16:20,659 para cada alumno 426 00:16:20,659 --> 00:16:22,820 en 427 00:16:22,820 --> 00:16:32,840 repositorio.alumnos 428 00:16:32,840 --> 00:16:36,899 un segundín, vamos a mostrar 429 00:16:36,899 --> 00:16:38,259 otra vez el nombre y la nota 430 00:16:38,259 --> 00:16:48,299 y tú le puedes pasar efectivamente 431 00:16:48,299 --> 00:16:50,679 un array de cualquier tipo 432 00:16:50,679 --> 00:16:52,759 de datos, yo le he pasado uno de alumnos 433 00:16:52,759 --> 00:16:54,779 pero le podría pasar un array de enteros 434 00:16:54,779 --> 00:16:55,740 un array de lo que fuera 435 00:16:55,740 --> 00:16:59,450 yo le he pasado un array de alumnos 436 00:16:59,450 --> 00:17:04,089 entonces, dice Jolines 437 00:17:04,089 --> 00:17:05,450 pues que fácil lo tengo 438 00:17:05,450 --> 00:17:08,289 tengo mi método sort estático 439 00:17:08,289 --> 00:17:09,990 de la clase Arrays que ya me hace eso 440 00:17:09,990 --> 00:17:12,289 no tengo que programar yo un algoritmo de ordenación 441 00:17:12,289 --> 00:17:13,970 tipo la burbuja, tipo el que sea 442 00:17:13,970 --> 00:17:16,450 y ya está 443 00:17:16,450 --> 00:17:18,690 me lo ordena y lo voy a mostrar a ver si está ordenado 444 00:17:18,690 --> 00:17:21,990 entonces, ¿no surge 445 00:17:21,990 --> 00:17:23,430 así de buenas a primeras alguna 446 00:17:23,430 --> 00:17:25,950 no hay nada que nos descuadre en la cabeza ahora mismo? 447 00:17:33,140 --> 00:17:33,940 sí, pero no 448 00:17:33,940 --> 00:17:36,500 ya, pero claro, esa es la pregunta de la que yo iba 449 00:17:36,500 --> 00:17:38,039 short dice 450 00:17:38,039 --> 00:17:40,200 yo te lo ordeno, pero ¿a algún momento le hemos dicho 451 00:17:40,200 --> 00:17:42,559 con qué criterio? ¿se puede ordenar por orden alfabético? 452 00:17:43,079 --> 00:17:43,839 ¿se puede ordenar por nota? 453 00:17:44,220 --> 00:17:45,900 ¿se puede ordenar porque me caiga mejor o peor? 454 00:17:47,180 --> 00:17:48,079 yo no le he dicho 455 00:17:48,079 --> 00:17:49,700 al programa, no le he dicho a short 456 00:17:49,700 --> 00:17:51,079 el criterio de ordenación 457 00:17:51,079 --> 00:17:53,460 porque los números 458 00:17:53,460 --> 00:17:56,220 tienen un criterio ya inherente a ellos 459 00:17:56,220 --> 00:17:58,000 que es el orden 460 00:17:58,000 --> 00:17:59,700 matemático, que conocemos 461 00:17:59,700 --> 00:18:02,339 ¿vale? del álgebra 462 00:18:02,339 --> 00:18:05,119 que nosotros conocemos 463 00:18:05,119 --> 00:18:07,880 ¿vale? no es el único orden posible 464 00:18:07,880 --> 00:18:09,359 pero es el orden al que nosotros estamos 465 00:18:09,359 --> 00:18:12,160 acostumbrados, entonces los números lo tienen 466 00:18:12,160 --> 00:18:14,059 un orden inherente, es que no tendríamos que 467 00:18:14,059 --> 00:18:16,279 darle al sort un criterio 468 00:18:16,279 --> 00:18:17,640 si le paso una raíz de números 469 00:18:17,640 --> 00:18:20,559 ya asume que los va a ordenar 470 00:18:20,559 --> 00:18:22,000 según el criterio 471 00:18:22,000 --> 00:18:24,440 de mayor y menor que nosotros conocemos 472 00:18:24,440 --> 00:18:26,539 pero es que los alumnos 473 00:18:26,539 --> 00:18:28,259 deben un criterio de orden inherente 474 00:18:28,259 --> 00:18:30,400 suyo, se puede ordenar de muchas maneras 475 00:18:30,400 --> 00:18:31,940 por altura 476 00:18:31,940 --> 00:18:35,180 por nota, por orden alfabético 477 00:18:35,180 --> 00:18:36,680 por número de deniz 478 00:18:36,680 --> 00:18:38,539 no hay 479 00:18:38,539 --> 00:18:40,839 un criterio 480 00:18:40,839 --> 00:18:42,819 universal para ordenar 481 00:18:42,819 --> 00:18:44,559 alumnos, entonces efectivamente 482 00:18:44,559 --> 00:18:46,220 aquí algo me escama, me dice 483 00:18:46,220 --> 00:18:48,440 lo ha tragado 484 00:18:48,440 --> 00:18:50,799 lo ha tragado pero yo no le he 485 00:18:50,799 --> 00:18:52,440 dicho como los va a ordenar 486 00:18:52,440 --> 00:18:54,339 uno podría plantearse ejecutar esto 487 00:18:54,339 --> 00:18:55,539 pues si lo ha tragado, algo hará 488 00:18:55,539 --> 00:18:58,599 uno podría plantearse ejecutarlo 489 00:18:58,599 --> 00:19:01,099 vamos a ejecutarlo 490 00:19:01,099 --> 00:19:07,910 vamos a insertar dos para que 491 00:19:07,910 --> 00:19:09,650 tenga 492 00:19:09,650 --> 00:19:13,950 número de alumnos 493 00:19:13,950 --> 00:19:20,880 que ordenar, vale, venga 494 00:19:20,880 --> 00:19:22,880 vamos a, el listado está, aquí están 495 00:19:22,880 --> 00:19:26,950 los dos, y ahora vamos 496 00:19:26,950 --> 00:19:28,930 a mostrar el listado ordenado por 497 00:19:28,930 --> 00:19:32,269 nota, claro, él lo ha tragado 498 00:19:32,269 --> 00:19:34,410 pero luego a la hora de 499 00:19:34,410 --> 00:19:36,490 ejecutar me dice 500 00:19:36,490 --> 00:19:37,950 alumno 501 00:19:37,950 --> 00:19:40,569 no lo puedo 502 00:19:40,569 --> 00:19:42,470 cambiar a comparable 503 00:19:42,470 --> 00:19:46,650 Es una forma de decirme, los alumnos no son comparables entre sí. 504 00:19:47,190 --> 00:19:51,809 Me está diciendo, para ordenar, tengo yo que comparar cuál es mayor y menor, 505 00:19:52,150 --> 00:19:53,210 sea con el criterio que sea. 506 00:19:53,589 --> 00:19:57,549 Te está diciendo, perdona, estos alumnos, cuando yo me he puesto a compararlos, 507 00:19:57,930 --> 00:20:00,049 no puedo compararlos, no puedo compararlos. 508 00:20:01,150 --> 00:20:01,269 ¿Vale? 509 00:20:02,269 --> 00:20:05,849 Entonces, los que no hay errores de compilación, obviamente no significa que esté todo bien. 510 00:20:06,150 --> 00:20:06,930 Aquí está, fatal. 511 00:20:08,430 --> 00:20:10,470 ¿Vale? Pues, ¿qué es lo que pasa aquí? 512 00:20:10,470 --> 00:20:13,109 que mis alumnos 513 00:20:13,109 --> 00:20:14,910 que tienen 514 00:20:14,910 --> 00:20:16,630 su NIF, su nombre y su nota 515 00:20:16,630 --> 00:20:18,930 no les basta para ser ordenados 516 00:20:18,930 --> 00:20:20,730 con que tengan su NIF, su nombre y su nota 517 00:20:20,730 --> 00:20:22,829 lo que tienen también es que 518 00:20:22,829 --> 00:20:24,549 implementar 519 00:20:24,549 --> 00:20:26,730 la funcionalidad de poder 520 00:20:26,730 --> 00:20:27,769 ser comparados 521 00:20:27,769 --> 00:20:31,759 ¿y esto en qué se traduce en Java? 522 00:20:32,019 --> 00:20:34,299 pues es el mismo patrón de interfaz que hemos visto antes 523 00:20:34,299 --> 00:20:36,400 Java nos da una interfaz 524 00:20:36,400 --> 00:20:38,259 que se llama comparable 525 00:20:38,259 --> 00:20:40,019 literalmente, comparable 526 00:20:40,019 --> 00:20:42,019 esa interfaz comparable 527 00:20:42,019 --> 00:20:45,460 significa poder ser comparados entre sí. 528 00:20:45,940 --> 00:20:48,319 Igual que la interfaz empleado-despedible 529 00:20:48,319 --> 00:20:50,400 significaba poder ser despedidos. 530 00:20:51,559 --> 00:20:52,980 Pues la interfaz comparable 531 00:20:52,980 --> 00:20:54,660 significa poder ser comparados. 532 00:20:55,259 --> 00:20:56,839 Entonces, si yo quiero que mis alumnos 533 00:20:56,839 --> 00:20:59,819 se puedan comparar entre sí para ordenarlos, 534 00:21:00,519 --> 00:21:04,380 tienen que incorporar ese comportamiento. 535 00:21:04,640 --> 00:21:05,579 Tienen que incorporarlo. 536 00:21:06,460 --> 00:21:07,579 Si no, no pueden ser comparados. 537 00:21:07,579 --> 00:21:09,740 E incorporar un comportamiento 538 00:21:09,740 --> 00:21:11,740 es implementar la interfaz 539 00:21:11,740 --> 00:21:13,440 que lo recoge, implementarla 540 00:21:13,440 --> 00:21:15,599 igual que el empleado 541 00:21:15,599 --> 00:21:17,339 temporal y empleado externo 542 00:21:17,339 --> 00:21:19,900 incorporar el poder ser despedidos 543 00:21:19,900 --> 00:21:22,119 significaba que implementaran 544 00:21:22,119 --> 00:21:23,700 empleado despedible 545 00:21:23,700 --> 00:21:25,720 pues para que los alumnos puedan 546 00:21:25,720 --> 00:21:27,559 ser comparados, tienen que 547 00:21:27,559 --> 00:21:29,460 implementar la interfaz 548 00:21:29,460 --> 00:21:31,759 comparable, que es la que les da 549 00:21:31,759 --> 00:21:33,960 la que les da el carácter 550 00:21:33,960 --> 00:21:36,039 de comparables, de poder 551 00:21:36,039 --> 00:21:37,079 ser comparados entre sí 552 00:21:37,079 --> 00:21:39,799 esa interfaz ya existe, es una de las miles 553 00:21:39,799 --> 00:21:41,779 que hay por aquí, lo único que tiene que hacer 554 00:21:41,779 --> 00:21:43,740 mi alumno ahora, mi alumno es 555 00:21:43,740 --> 00:21:52,849 implementarla, ala 556 00:21:52,849 --> 00:21:54,049 ya implementa comparable 557 00:21:54,049 --> 00:22:00,130 ¿vale? pero claro 558 00:22:00,130 --> 00:22:02,309 ¿qué pasa cuando una clase 559 00:22:02,309 --> 00:22:03,910 implementa una interfaz? 560 00:22:06,369 --> 00:22:07,509 como el ejemplo de antes 561 00:22:07,509 --> 00:22:10,089 edificio, empleado temporal 562 00:22:10,089 --> 00:22:10,950 empleado externo 563 00:22:10,950 --> 00:22:13,910 implementaba empleado despedible 564 00:22:13,910 --> 00:22:16,329 pero cuando lo implementaba decía, oh que tú eres despedible 565 00:22:16,329 --> 00:22:18,049 pues perdona, dime cómo te hacemos 566 00:22:18,049 --> 00:22:20,509 el finiquito, si no me lo dices no puedes 567 00:22:20,509 --> 00:22:22,609 y eso se traducía 568 00:22:22,609 --> 00:22:24,410 en implementar 569 00:22:24,410 --> 00:22:26,250 el método, generar finiquito 570 00:22:26,250 --> 00:22:28,269 pues esto igual, dices, oye que tú 571 00:22:28,269 --> 00:22:29,569 quieres implementar comparable 572 00:22:29,569 --> 00:22:31,730 vale, pero dime cómo te comparo 573 00:22:31,730 --> 00:22:33,950 si no me lo dices, cómo te comparo 574 00:22:33,950 --> 00:22:36,430 pues es lo que me está diciendo, me está diciendo, oye si implementas 575 00:22:36,430 --> 00:22:38,269 comparable, tienes que 576 00:22:38,269 --> 00:22:40,569 dar código, tienes que implementar 577 00:22:40,569 --> 00:22:42,309 tienes que dar código a los 578 00:22:42,309 --> 00:22:44,470 métodos de comparable, tienes que darlo 579 00:22:44,470 --> 00:22:46,470 y cuáles son los métodos de comparable 580 00:22:46,470 --> 00:22:51,029 Pues el compare tú, precisamente, que te dice cómo comparar un alumno con otro. 581 00:22:52,589 --> 00:22:57,369 Entonces, si implementamos ese método, es este. 582 00:22:57,990 --> 00:23:00,049 Ahora ya se cae al compilador, es este. 583 00:23:03,579 --> 00:23:10,259 Vale, pues este método, este método es el método que van a usar las otras clases, 584 00:23:11,319 --> 00:23:14,559 como la clase a raíz, que quieran comparar un alumno con otro. 585 00:23:15,400 --> 00:23:18,880 Pero claro, lo van a usar siguiendo un criterio común, estándar. 586 00:23:19,259 --> 00:23:27,019 Entonces, lo que significa el método es, este método lo va a llamar un objeto alumno y se le va a pasar como parámetro a otro objeto alumno. 587 00:23:28,200 --> 00:23:38,519 Como veis, lo declara como object porque todavía no sabemos parametrizar, ya más adelante, olvidaos de eso, pero es que dentro de object cabe un objeto alumno y cabe cualquiera, obviamente, cabe cualquiera, porque es object. 588 00:23:39,380 --> 00:23:43,599 Pues a este método lo va a llamar un alumno y le va a pasar otro alumno. 589 00:23:43,599 --> 00:23:46,599 bueno, pues el convenio 590 00:23:46,599 --> 00:23:47,480 que seguimos es 591 00:23:47,480 --> 00:23:49,440 que esto va a devolver un entero 592 00:23:49,440 --> 00:23:51,960 si el numerito que devuelves es negativo 593 00:23:51,960 --> 00:23:54,579 entonces el que llama al método 594 00:23:54,579 --> 00:23:56,079 se sobreentiende que va antes 595 00:23:56,079 --> 00:23:58,839 si devuelve cero 596 00:23:58,839 --> 00:24:00,279 se sobreentiende 597 00:24:00,279 --> 00:24:02,220 que son iguales 598 00:24:02,220 --> 00:24:03,799 que están en la misma posición 599 00:24:03,799 --> 00:24:06,460 y si devuelve un número que sea 600 00:24:06,460 --> 00:24:08,660 positivo, se sobreentiende 601 00:24:08,660 --> 00:24:10,779 que el que llama al método va después del otro 602 00:24:10,779 --> 00:24:12,660 ese es el criterio 603 00:24:12,660 --> 00:24:15,539 Y ese es el criterio que usa Arrays 604 00:24:15,539 --> 00:24:19,339 y que usa cualquier clase que necesite comparar cosas. 605 00:24:20,200 --> 00:24:22,819 La clase Arrays con el método sort 606 00:24:22,819 --> 00:24:25,920 llamará al compareTo para comparar. 607 00:24:26,740 --> 00:24:28,279 Cuando salga negativo interpretará 608 00:24:28,279 --> 00:24:29,640 que el que llama al método va antes. 609 00:24:29,940 --> 00:24:31,619 Cuando salga cero que son iguales. 610 00:24:31,759 --> 00:24:33,759 Cuando salga positivo interpretará 611 00:24:33,759 --> 00:24:34,940 que el que llama al método va después. 612 00:24:36,460 --> 00:24:38,839 Bueno, pues entonces tenemos que programar este método 613 00:24:38,839 --> 00:24:40,359 siguiendo ese criterio. 614 00:24:40,359 --> 00:24:43,420 entonces si vamos a programar por nota 615 00:24:43,420 --> 00:24:45,359 vamos a hacerlo muy extendido 616 00:24:45,359 --> 00:24:47,220 que luego lo podremos simplificar 617 00:24:47,220 --> 00:24:49,420 pues si el objeto que llama 618 00:24:49,420 --> 00:24:50,859 el método punto nota 619 00:24:50,859 --> 00:24:53,200 resulta que es menor 620 00:24:53,200 --> 00:24:55,519 que la nota de este 621 00:24:55,519 --> 00:25:01,000 pero claro 622 00:25:01,000 --> 00:25:03,440 yo no puedo llamar 623 00:25:03,440 --> 00:25:04,660 a la nota de este objeto, ¿verdad? 624 00:25:05,920 --> 00:25:06,839 porque es obvio 625 00:25:06,839 --> 00:25:08,140 pero no pasa nada, ¿qué hago? 626 00:25:12,529 --> 00:25:15,549 ¿qué hago para poder llamar a la nota de este objeto 627 00:25:15,549 --> 00:25:17,170 en casting? 628 00:25:17,170 --> 00:25:19,890 yo sé que el que le voy a pasar es un alumno 629 00:25:19,890 --> 00:25:21,769 entonces no pasa nada, me hago un casting 630 00:25:21,769 --> 00:25:29,079 hala, ya está 631 00:25:29,079 --> 00:25:31,539 pues si la nota del que llama 632 00:25:31,539 --> 00:25:33,880 el método es mayor que la nota de este 633 00:25:33,880 --> 00:25:35,839 si ordeno 634 00:25:35,839 --> 00:25:36,680 en orden ascendente 635 00:25:36,680 --> 00:25:38,440 pues entonces 636 00:25:38,440 --> 00:25:41,440 voy a devolver un número negativo 637 00:25:41,440 --> 00:25:47,150 por ejemplo el menos uno 638 00:25:47,150 --> 00:25:51,150 con eso indico 639 00:25:51,150 --> 00:25:52,690 que este va antes que el otro 640 00:25:52,690 --> 00:25:55,049 si devuelvo el negativo, el que llama el método 641 00:25:55,049 --> 00:25:56,970 va antes que el otro, devuelvo un negativo 642 00:25:56,970 --> 00:25:57,329 vale 643 00:25:57,329 --> 00:25:59,529 si no 644 00:25:59,529 --> 00:26:02,869 si la nota es mayor 645 00:26:02,869 --> 00:26:10,099 pues entonces el que llama 646 00:26:10,099 --> 00:26:12,180 al método va después 647 00:26:12,180 --> 00:26:14,380 pues entonces 648 00:26:14,380 --> 00:26:16,539 voy a devolver un positivo para indicarlo 649 00:26:16,539 --> 00:26:20,279 y si no es ni mayor ni menor 650 00:26:20,279 --> 00:26:21,859 es que las notas son iguales 651 00:26:21,859 --> 00:26:24,299 pues están en la misma posición en cuanto a su orden 652 00:26:24,299 --> 00:26:25,579 en ese caso devuelvo cero 653 00:26:25,579 --> 00:26:28,319 bueno pues esta sería 654 00:26:28,319 --> 00:26:30,079 una implementación del compare tú 655 00:26:30,079 --> 00:26:33,680 que dice que los alumnos se ordenan 656 00:26:33,680 --> 00:26:34,980 por 657 00:26:34,980 --> 00:26:36,759 nota 658 00:26:36,759 --> 00:26:37,960 ascendente. 659 00:26:39,220 --> 00:26:40,640 Va antes el que menos nota tenga. 660 00:26:43,069 --> 00:26:44,609 ¿Vale? Pues entonces, alumno implementado 661 00:26:44,609 --> 00:26:46,490 comparable, para decirle al mundo 662 00:26:46,490 --> 00:26:47,710 que lo quiera usar, 663 00:26:48,369 --> 00:26:50,289 oye, que los alumnos son comparables entre sí. 664 00:26:50,750 --> 00:26:51,970 O sea, al implementar comparable, 665 00:26:52,490 --> 00:26:54,549 la clase alumno le está diciendo al mundo, 666 00:26:54,730 --> 00:26:56,869 oye, que quien necesite ordenarme 667 00:26:56,869 --> 00:26:57,450 va a poder. 668 00:26:58,789 --> 00:27:00,509 Antes, si no implementabas comparable, 669 00:27:00,509 --> 00:27:01,910 tú no le estabas diciendo al mundo 670 00:27:01,910 --> 00:27:03,170 el que quiera ordenarme va a poder. 671 00:27:04,430 --> 00:27:06,569 Ahora le dices, oye, el que quiera ordenarme 672 00:27:06,569 --> 00:27:08,450 puede. El que quiera ordenar a alumnos 673 00:27:08,450 --> 00:27:10,650 va a poder. En este caso concreto 674 00:27:10,650 --> 00:27:11,869 ¿quién va a querer ordenarle? 675 00:27:12,970 --> 00:27:13,609 Pues Orto. 676 00:27:14,210 --> 00:27:16,450 Pero podría haber otros métodos, otras cosas que necesitan 677 00:27:16,450 --> 00:27:18,269 ordenarle. Pero en este caso 678 00:27:18,269 --> 00:27:19,190 estamos usando esta. 679 00:27:20,849 --> 00:27:22,670 Pues con esto le decimos al mundo 680 00:27:22,670 --> 00:27:24,470 que los alumnos pueden ser ordenados 681 00:27:24,470 --> 00:27:26,809 entre sí. Pero no basta con informar 682 00:27:26,809 --> 00:27:27,710 a los cuatro vientos 683 00:27:27,710 --> 00:27:30,250 de que los alumnos pueden ser ordenados entre sí. 684 00:27:30,509 --> 00:27:57,950 Hay que implementar el criterio, hay que implementar el criterio, si hemos decidido porque a nuestra aplicación es el que le interesa que sea por nota, pues entonces ponemos esto, lo importante es devolver menos uno o negativo si el que llama al método va antes que el parámetro, devolver cero es de la misma posición y devolver algo que sea positivo si el que llama al método va después, eso es lo importante. 685 00:27:57,950 --> 00:28:01,049 bueno, pues ya está, así lo puedo hacer 686 00:28:01,049 --> 00:28:02,869 hombre, tendría una versión un poquito 687 00:28:02,869 --> 00:28:04,849 más resumida de este método 688 00:28:04,849 --> 00:28:06,769 ¿verdad? si yo le hago 689 00:28:06,769 --> 00:28:10,180 esto, return 690 00:28:10,180 --> 00:28:13,900 dis.nota 691 00:28:13,900 --> 00:28:15,019 menos 692 00:28:15,019 --> 00:28:18,950 esto de aquí, ¿verdad? 693 00:28:23,549 --> 00:28:25,970 me falta algún paréntesis o me 694 00:28:25,970 --> 00:28:26,710 sobra o 695 00:28:26,710 --> 00:28:28,390 me sobra 696 00:28:28,390 --> 00:28:31,569 ¿vale? porque 697 00:28:31,569 --> 00:28:33,650 si la nota del que llama al método 698 00:28:33,650 --> 00:28:36,789 es más pequeña que la del otro 699 00:28:36,789 --> 00:28:38,809 esta resta va a ser negativa 700 00:28:38,809 --> 00:28:40,529 que es justo lo que queremos 701 00:28:40,529 --> 00:28:43,049 si las notas de ambos son iguales 702 00:28:43,049 --> 00:28:43,710 va a ser cero 703 00:28:43,710 --> 00:28:46,970 y si la nota del que llama el método es mayor que el otro 704 00:28:46,970 --> 00:28:48,670 esta resta va a ser positiva 705 00:28:48,670 --> 00:28:50,509 luego 706 00:28:50,509 --> 00:28:51,789 con este código 707 00:28:51,789 --> 00:28:54,750 y con esto me da igual 708 00:28:54,750 --> 00:28:56,569 estoy haciendo lo mismo con uno que con otro 709 00:28:56,569 --> 00:28:58,650 lo que más os guste 710 00:28:58,650 --> 00:28:59,069 ¿vale? 711 00:29:00,529 --> 00:29:02,309 o la línea de arriba o esto de abajo 712 00:29:02,309 --> 00:29:03,329 es lo mismo 713 00:29:03,329 --> 00:29:08,799 bueno, pues entonces, ya he dicho que mis alumnos 714 00:29:08,799 --> 00:29:11,039 son comparables y además he dicho con qué criterio 715 00:29:11,039 --> 00:29:12,500 ahora ya sort 716 00:29:12,500 --> 00:29:15,200 quedará tranquilo, suponemos, cuando lo llamemos 717 00:29:15,200 --> 00:29:16,819 sort ya tiene 718 00:29:16,819 --> 00:29:18,240 un criterio para ordenarlos 719 00:29:18,240 --> 00:29:20,200 vamos a ver si lo hemos hecho bien 720 00:29:20,200 --> 00:29:29,039 bien, vamos a insertar tres 721 00:29:29,039 --> 00:29:30,140 desordenados 722 00:29:30,140 --> 00:29:34,339 esta tiene un seis, vale 723 00:29:34,339 --> 00:29:36,819 vamos a 724 00:29:36,819 --> 00:29:37,900 insertar 725 00:29:37,900 --> 00:29:44,660 ya voy mal, porque he puesto 726 00:29:44,660 --> 00:29:46,740 como nif, bueno, pero da igual, el nif le permite 727 00:29:46,740 --> 00:29:48,839 un string también, pues da igual 728 00:29:48,839 --> 00:29:50,099 esta 729 00:29:50,099 --> 00:29:52,500 tiene un 6 y voy a permitir 730 00:29:52,500 --> 00:29:54,220 otra que tenga un 1 731 00:29:54,220 --> 00:29:55,839 y así 732 00:29:55,839 --> 00:30:02,519 vale, pues este 733 00:30:02,519 --> 00:30:04,420 tiene un 1, vamos a ver 734 00:30:04,420 --> 00:30:06,299 el listado, 3 735 00:30:06,299 --> 00:30:11,220 vale, pues bueno 736 00:30:11,220 --> 00:30:13,279 he puesto dos notas iguales 737 00:30:13,279 --> 00:30:15,099 estas son 738 00:30:15,099 --> 00:30:17,059 vamos a mostrar listado ordenado 739 00:30:17,059 --> 00:30:19,079 por nota, 4 740 00:30:19,079 --> 00:30:23,240 bueno, parece que ordena 741 00:30:23,240 --> 00:30:25,259 lo que pasa es que no he metido los datos 742 00:30:25,259 --> 00:30:26,960 pero vamos, si hacéis pruebas 743 00:30:26,960 --> 00:30:29,200 con más datos 744 00:30:29,200 --> 00:30:31,440 efectivamente ahora ya sí que ordena 745 00:30:31,440 --> 00:30:40,180 ahora ya sí que ordena 746 00:30:40,180 --> 00:30:42,440 vale, pues este es un ejemplo 747 00:30:42,440 --> 00:30:45,700 este es un ejemplo del uso 748 00:30:45,700 --> 00:30:47,519 de la motivación, de para qué sirven 749 00:30:47,519 --> 00:30:48,799 por qué existen las interfaces 750 00:30:48,799 --> 00:30:51,779 las interfaces son una forma 751 00:30:51,779 --> 00:30:54,019 de recoger comportamientos 752 00:30:54,019 --> 00:30:55,440 a los que uno puede adherirse 753 00:30:55,440 --> 00:30:56,380 o puede no adherirse. 754 00:30:57,619 --> 00:30:59,480 Se adhiere si le interesa y si no, no. 755 00:30:59,720 --> 00:31:00,779 Recogen comportamientos. 756 00:31:01,440 --> 00:31:03,440 Despedible, comparable, es su uso habitual. 757 00:31:03,619 --> 00:31:04,579 Recogen comportamientos. 758 00:31:05,759 --> 00:31:07,700 Entonces, si tú te adhieres a ese comportamiento, 759 00:31:09,079 --> 00:31:11,079 tienes que darle cuerpo a ese comportamiento 760 00:31:11,079 --> 00:31:12,279 y decir cómo lo vas a hacer. 761 00:31:12,380 --> 00:31:13,660 Tienes que decir cómo lo vas a hacer. 762 00:31:14,319 --> 00:31:15,660 Y luego ya el resto del mundo, 763 00:31:16,339 --> 00:31:18,180 como ya va a asumir que tú te has adherido 764 00:31:18,180 --> 00:31:20,019 a ese comportamiento porque has implementado 765 00:31:20,019 --> 00:31:23,160 la interfaz, ya podrá usarte 766 00:31:23,160 --> 00:31:25,460 llamando a esos métodos 767 00:31:25,460 --> 00:31:27,579 para que tú ejerzas 768 00:31:27,579 --> 00:31:30,039 ese comportamiento, para que tú lo ejerzas 769 00:31:30,039 --> 00:31:31,460 aquí sort 770 00:31:31,460 --> 00:31:33,759 nosotros claro, no hemos visto lo que 771 00:31:33,759 --> 00:31:35,660 hace por dentro sort, pero 772 00:31:35,660 --> 00:31:37,779 aquí sort lo que 773 00:31:37,779 --> 00:31:38,579 hará por dentro 774 00:31:38,579 --> 00:31:41,859 en el main, lo que hará por dentro 775 00:31:41,859 --> 00:31:42,900 sort será 776 00:31:42,900 --> 00:31:45,859 coger cada alumno, ir uno por 777 00:31:45,859 --> 00:31:47,539 uno, llamar al compare to para 778 00:31:47,539 --> 00:31:49,759 aplicar su algoritmo, porque ya 779 00:31:49,759 --> 00:31:51,119 sabe que son comparables 780 00:31:51,119 --> 00:31:53,380 entonces llama al compare tú para compararlos 781 00:31:53,380 --> 00:31:55,180 etcétera, cuando lo ha intentado la otra vez 782 00:31:55,180 --> 00:31:56,880 y ha ido a llamar al compare tú 783 00:31:56,880 --> 00:31:58,680 decía, eh, pero si estos no son comparables 784 00:31:58,680 --> 00:32:01,339 no se han adherido a ese comportamiento 785 00:32:01,339 --> 00:32:02,200 de ser comparables 786 00:32:02,200 --> 00:32:04,779 por eso las interfaces 787 00:32:04,779 --> 00:32:06,940 recogen comportamientos, uno 788 00:32:06,940 --> 00:32:09,259 en su aplicación diseña lo que le interesa 789 00:32:09,259 --> 00:32:11,539 las entidades que sean 790 00:32:11,539 --> 00:32:12,980 se adhieren, yo 791 00:32:12,980 --> 00:32:14,500 además de ser esto 792 00:32:14,500 --> 00:32:17,119 me adhiero a esto, y a esto, y a esto 793 00:32:17,119 --> 00:32:18,880 a todos los que quieran, separadas por comas 794 00:32:18,880 --> 00:32:21,000 y ahora ya el resto del mundo 795 00:32:21,000 --> 00:32:23,000 asume que yo puedo ejecutar 796 00:32:23,000 --> 00:32:25,380 esos métodos, lo asume porque los tengo implementados 797 00:32:25,380 --> 00:32:27,299 y me llama para ejecutarlos 798 00:32:27,299 --> 00:32:28,400 y ya está 799 00:32:28,400 --> 00:32:30,720 ¿vale? porque yo he dicho que sí 800 00:32:30,720 --> 00:32:32,759 que yo me comporto de esa manera y hago esas cosas 801 00:32:32,759 --> 00:32:35,000 ¿vale? 802 00:32:40,599 --> 00:32:41,559 claro, claro 803 00:32:41,559 --> 00:32:46,019 ¿eh? 804 00:32:47,279 --> 00:32:48,400 claro, en este caso 805 00:32:48,400 --> 00:32:49,039 claro 806 00:32:49,039 --> 00:32:52,200 el listado me lo ha 807 00:32:52,200 --> 00:32:53,579 me lo ha dejado ya ordenado 808 00:32:53,579 --> 00:32:55,660 que yo quiero mostrarlo 809 00:32:55,660 --> 00:32:57,740 O sea, el array me lo cambia de sitio. 810 00:32:58,400 --> 00:33:01,019 Que yo no quiero eso, podría usar un auxiliar. 811 00:33:01,200 --> 00:33:01,940 Podría hacer esto. 812 00:33:03,480 --> 00:33:03,960 Alumno. 813 00:33:04,960 --> 00:33:05,980 Imagínate que hago esto. 814 00:33:06,059 --> 00:33:07,880 Me hago aquí un auxiliar que tenga alumnos. 815 00:33:08,700 --> 00:33:11,400 Y el que ordeno, que sea el auxiliar. 816 00:33:12,799 --> 00:33:14,559 Y luego muestro el auxiliar. 817 00:33:17,940 --> 00:33:26,079 Entonces, ¿vale? 818 00:33:26,079 --> 00:33:32,759 Entonces, si yo hago esto, me ha ordenado una copia para efectos de mostrarlo. 819 00:33:32,759 --> 00:33:35,259 Pero el repositorio sigue con su 820 00:33:35,259 --> 00:33:37,119 Array de alumnos con el orden que tuvieran 821 00:33:37,119 --> 00:33:39,619 ¿Vale? Depende de lo que yo quiera hacer 822 00:33:39,619 --> 00:33:40,819 ¿Vale? 823 00:33:45,769 --> 00:33:47,250 Vale, pues entonces 824 00:33:47,250 --> 00:33:48,329 Eh...