1 00:00:00,000 --> 00:00:01,940 5 minutos y nos piramos. 2 00:00:02,560 --> 00:00:03,399 Este es nuestro array 3 00:00:03,399 --> 00:00:05,120 que tengo que ordenar. 4 00:00:06,400 --> 00:00:07,419 Es un rollo. 5 00:00:08,019 --> 00:00:09,939 Ordenar no es tan fácil como hacer 6 00:00:09,939 --> 00:00:11,279 una suma acumulativa, 7 00:00:12,259 --> 00:00:14,220 ver el máximo de algo, 8 00:00:15,580 --> 00:00:16,000 contar 9 00:00:16,000 --> 00:00:17,620 cuántas veces pasa algo en un array, 10 00:00:17,780 --> 00:00:19,320 que son más o menos los algoritmos que hemos visto. 11 00:00:19,839 --> 00:00:22,120 Pues contar dentro de un array las ocurrencias de algo, 12 00:00:22,920 --> 00:00:23,899 sumar de forma 13 00:00:23,899 --> 00:00:25,960 acumulativa o multiplicar 14 00:00:25,960 --> 00:00:28,000 de forma acumulativa cosas o calcular 15 00:00:28,000 --> 00:00:30,320 máximos y mínimos, son como los algoritmos básicos 16 00:00:30,320 --> 00:00:32,100 que esos pues ya los tenemos 17 00:00:32,100 --> 00:00:33,159 en la cabeza bien metidos 18 00:00:33,159 --> 00:00:35,159 ordenar es más complicado 19 00:00:35,159 --> 00:00:38,200 ordenar no es tan sencillo, nos podemos plantear 20 00:00:38,200 --> 00:00:40,140 entonces hacerlo desde cero y muy bien 21 00:00:40,140 --> 00:00:41,500 porque somos muy listos y lo haríamos 22 00:00:41,500 --> 00:00:44,439 y en el pasado pues lo hacíamos 23 00:00:44,439 --> 00:00:45,640 pero ahora 24 00:00:45,640 --> 00:00:47,280 sois más vagos 25 00:00:47,280 --> 00:00:49,299 entonces ahora no 26 00:00:49,299 --> 00:00:51,619 se pueden pedir ciertas cosas porque 27 00:00:51,619 --> 00:00:53,100 entonces 28 00:00:53,100 --> 00:00:54,899 y aparte 29 00:00:54,899 --> 00:00:56,859 no es tan fácil 30 00:00:56,859 --> 00:00:59,539 y de hecho el problema de la ordenación 31 00:00:59,539 --> 00:01:01,460 es que como implica 32 00:01:01,460 --> 00:01:03,320 bucles anidados o puede implicarlos 33 00:01:03,320 --> 00:01:05,140 si tú no los gestionas bien 34 00:01:05,140 --> 00:01:07,420 la complejidad se puede hacer 35 00:01:07,420 --> 00:01:08,819 muy grande, entonces cuando tú 36 00:01:08,819 --> 00:01:11,459 usas el método de ordenar para un array 37 00:01:11,459 --> 00:01:13,019 de tres elementos no tarda nada 38 00:01:13,019 --> 00:01:15,159 pero si pasas a ese mismo método 39 00:01:15,159 --> 00:01:17,379 un array de diez, en cuanto hay dos bucles 40 00:01:17,379 --> 00:01:19,599 anidados, un montón de ciclos 41 00:01:19,599 --> 00:01:20,659 de memoria, tarda un montón 42 00:01:20,659 --> 00:01:22,379 y si quieres ordenar cien 43 00:01:22,379 --> 00:01:25,260 esos dos bucles anidados ya se están 44 00:01:25,260 --> 00:01:27,120 y ni se sabe, y el ordenador tarda 45 00:01:27,120 --> 00:01:28,379 ni se sabe, entre comillas 46 00:01:28,379 --> 00:01:30,900 milisegundos, milisegundos ya es bastante 47 00:01:30,900 --> 00:01:32,040 en términos informáticos 48 00:01:32,040 --> 00:01:34,140 bueno, entonces, como no es trivial 49 00:01:34,140 --> 00:01:37,099 el tema de ordenar, porque si no 50 00:01:37,099 --> 00:01:38,620 escoges bien el algoritmo 51 00:01:38,620 --> 00:01:41,079 el tiempo de ordenación 52 00:01:41,079 --> 00:01:43,200 crece exponencialmente 53 00:01:43,200 --> 00:01:45,340 respecto al número de elementos a ordenar 54 00:01:45,340 --> 00:01:47,560 pues hay toda una teoría 55 00:01:47,560 --> 00:01:49,239 desarrollada y muchos 56 00:01:49,239 --> 00:01:50,819 algoritmos de ordenación distintos 57 00:01:50,819 --> 00:01:52,879 el de la burbuja, el click 58 00:01:52,879 --> 00:01:54,939 el quick short, hay muchos algoritmos de ordenación 59 00:01:54,939 --> 00:01:57,719 que nosotros por falta de tiempo 60 00:01:57,719 --> 00:01:59,079 muchas cosas, bueno vamos a ver aquí 61 00:01:59,079 --> 00:02:01,180 podéis buscar ¿cómo es el algoritmo de burbuja? 62 00:02:01,280 --> 00:02:03,799 ¿cómo es el algoritmo del juizor? ¿cómo es el algoritmo de no sé qué? 63 00:02:04,280 --> 00:02:05,239 y veis como son por dentro 64 00:02:05,239 --> 00:02:07,980 ¿nosotros qué hacemos? pues somos muy vagos 65 00:02:07,980 --> 00:02:10,039 y como ya hay métodos 66 00:02:10,039 --> 00:02:11,439 en Java que me ordenan 67 00:02:11,439 --> 00:02:13,919 pues los querríamos llamar 68 00:02:13,919 --> 00:02:15,460 por ejemplo 69 00:02:15,460 --> 00:02:17,960 la clase 70 00:02:17,960 --> 00:02:19,800 Arrays es una clase 71 00:02:19,800 --> 00:02:20,500 muy maja 72 00:02:20,500 --> 00:02:23,300 que tiene un montón de métodos estáticos 73 00:02:23,300 --> 00:02:24,560 para hacer cosas con Arrays 74 00:02:24,560 --> 00:02:27,860 entonces como son métodos estáticos 75 00:02:27,860 --> 00:02:29,780 los podemos llamar con el nombre de la clase 76 00:02:29,780 --> 00:02:31,939 vale, pues tiene un montón 77 00:02:31,939 --> 00:02:32,680 de cositas 78 00:02:32,680 --> 00:02:35,360 y entre ellos 79 00:02:35,360 --> 00:02:37,520 tiene un método que es el sort 80 00:02:37,520 --> 00:02:38,580 vale 81 00:02:38,580 --> 00:02:43,539 entonces al sort yo le paso 82 00:02:43,539 --> 00:02:44,479 un array 83 00:02:44,479 --> 00:02:48,750 y magnífico 84 00:02:48,750 --> 00:02:51,110 me lo ordena, porque para eso vale el sort 85 00:02:51,110 --> 00:02:52,550 para ordenar un array 86 00:02:52,550 --> 00:02:56,349 ay que listos que son 87 00:02:56,349 --> 00:02:58,889 vale, entonces es la siguiente pregunta 88 00:02:58,889 --> 00:03:00,569 ¿cómo me lo ordena? 89 00:03:00,870 --> 00:03:02,530 porque si fuera un array de números 90 00:03:02,530 --> 00:03:04,050 no hay ninguna duda 91 00:03:04,050 --> 00:03:06,650 porque hay entidades en Java que tienen 92 00:03:06,650 --> 00:03:08,590 un orden natural por definición 93 00:03:08,590 --> 00:03:10,409 como los int 94 00:03:10,409 --> 00:03:12,050 y los double 95 00:03:12,050 --> 00:03:14,909 y los char, que es el de 96 00:03:14,909 --> 00:03:16,370 el de la tabla AST 97 00:03:16,370 --> 00:03:18,729 el resto no 98 00:03:18,729 --> 00:03:20,509 tienen un orden natural, solo tienen 99 00:03:20,509 --> 00:03:21,770 los números y los caracteres 100 00:03:21,770 --> 00:03:24,590 con lo cual hay que dárselo por código 101 00:03:24,590 --> 00:03:26,030 hay que dárselo por código 102 00:03:26,030 --> 00:03:28,310 ¿y cómo se lo damos por código? 103 00:03:28,930 --> 00:03:30,750 pues gracias a que tenemos la herencia 104 00:03:30,750 --> 00:03:32,490 las interfaces, todo eso 105 00:03:32,490 --> 00:03:34,409 esto ahora ya es muy fácil 106 00:03:34,409 --> 00:03:35,810 porque 107 00:03:35,810 --> 00:03:38,729 las clases de Java están todas metidas en una arquitectura 108 00:03:38,729 --> 00:03:39,729 de herencia, entonces 109 00:03:39,729 --> 00:03:42,629 el ser ordenable, el que yo me pueda 110 00:03:42,629 --> 00:03:44,509 ordenar, es un 111 00:03:44,509 --> 00:03:45,849 comportamiento que puedo 112 00:03:45,849 --> 00:03:47,509 desear adquirir o no 113 00:03:47,509 --> 00:03:50,509 vosotros por definición no os podéis 114 00:03:50,509 --> 00:03:52,469 ordenar entre vosotros, porque no tenéis 115 00:03:52,469 --> 00:03:54,349 ningún criterio de ordenación, no podéis 116 00:03:54,349 --> 00:03:56,590 ordenar, pero si todos os ponéis 117 00:03:56,590 --> 00:03:57,930 de acuerdo en decir, sí 118 00:03:57,930 --> 00:04:00,169 nos queremos ordenar por altura 119 00:04:00,169 --> 00:04:02,629 magnífico, ya automáticamente 120 00:04:02,629 --> 00:04:04,030 sois ordenables por altura 121 00:04:04,030 --> 00:04:06,590 de repente cambiáis, no, queremos 122 00:04:06,590 --> 00:04:08,830 seguir siendo ordenables, pero ahora queremos ser ordenables 123 00:04:08,830 --> 00:04:09,889 por nota 124 00:04:09,889 --> 00:04:11,930 pues ahora sois ordenables por nota 125 00:04:11,930 --> 00:04:14,930 ¿vale? entonces vosotros podéis decidir 126 00:04:14,930 --> 00:04:16,189 adheriros 127 00:04:16,189 --> 00:04:18,649 al rol de ser 128 00:04:18,649 --> 00:04:19,250 ordenables 129 00:04:19,250 --> 00:04:22,529 ¿y qué significaba adherirse 130 00:04:22,529 --> 00:04:23,050 a un rol? 131 00:04:24,350 --> 00:04:25,670 implementar una interfaz. 132 00:04:25,970 --> 00:04:26,949 ¿Por qué son las interfaces? 133 00:04:27,470 --> 00:04:28,649 Las interfaces son roles. 134 00:04:29,509 --> 00:04:34,250 El rol de visible, escondible, rompible, ¿vale? 135 00:04:34,370 --> 00:04:36,569 Pues hay un rol que es ordenable. 136 00:04:37,730 --> 00:04:40,529 Y ese rol no hace falta que lo programemos nosotros, 137 00:04:40,649 --> 00:04:41,790 esa interfaz, ya está. 138 00:04:42,670 --> 00:04:44,189 Lo único que tenemos que hacer es implementarla. 139 00:04:45,009 --> 00:04:47,750 ¿Y cómo se llama ese rol, esa interfaz en Java? 140 00:04:48,230 --> 00:04:49,829 Se llama no ordenable. 141 00:04:50,329 --> 00:04:51,569 Se llama comparable. 142 00:04:52,389 --> 00:04:54,170 Entonces, si yo quiero que una entidad mía 143 00:04:54,170 --> 00:04:56,230 que por definición no es ordenable 144 00:04:56,230 --> 00:04:58,110 no lo es, una reserva no es ordenable 145 00:04:58,110 --> 00:04:59,629 solo lo son los números y los charts 146 00:04:59,629 --> 00:05:01,509 si yo quiero que una entidad mía 147 00:05:01,509 --> 00:05:04,069 cumpla el rol de ser ordenable 148 00:05:04,069 --> 00:05:05,689 con otras iguales suyas 149 00:05:05,689 --> 00:05:08,350 con otras iguales suyas, tiene que implementar 150 00:05:08,350 --> 00:05:09,870 ese rol que se llama comparable 151 00:05:09,870 --> 00:05:11,949 bueno, pues aquí que queremos 152 00:05:11,949 --> 00:05:13,990 queremos que reservación 153 00:05:13,990 --> 00:05:15,509 que mis reservas 154 00:05:15,509 --> 00:05:18,129 mis reservas, estas de aquí 155 00:05:18,129 --> 00:05:20,670 implementen ese rol 156 00:05:20,670 --> 00:05:22,649 pues me voy a mi clase de reserva 157 00:05:22,649 --> 00:05:23,750 y le digo, oye tú 158 00:05:23,750 --> 00:05:28,209 implementa 159 00:05:28,209 --> 00:05:30,709 comparable 160 00:05:30,709 --> 00:05:33,750 magnífico 161 00:05:33,750 --> 00:05:36,050 como implementas comparable 162 00:05:36,050 --> 00:05:37,850 ya eres ordenable 163 00:05:37,850 --> 00:05:39,610 pero claro 164 00:05:39,610 --> 00:05:42,449 ¿qué pasa cuando implementamos una interfaz? 165 00:05:42,850 --> 00:05:44,769 que tenemos que obligatoriamente 166 00:05:44,769 --> 00:05:46,790 implementar los métodos de esa interfaz 167 00:05:46,790 --> 00:05:48,129 lógicamente 168 00:05:48,129 --> 00:05:50,930 comparable es una interfaz que tiene métodos 169 00:05:50,930 --> 00:05:52,290 si yo quiero ser comparable 170 00:05:52,290 --> 00:05:54,009 tengo que implementar los métodos de comparable 171 00:05:54,009 --> 00:05:55,810 ¿cuáles sean esos métodos? 172 00:05:55,829 --> 00:05:57,350 los métodos que decían el criterio, 173 00:05:57,509 --> 00:05:59,069 lógicamente, los que decían el criterio. 174 00:06:00,689 --> 00:06:02,329 ¿Vale? Pues esto es lo que nos dice este. 175 00:06:02,430 --> 00:06:03,170 Nos dice, oye, 176 00:06:03,810 --> 00:06:05,589 si quieres implementar comparable, 177 00:06:06,410 --> 00:06:07,689 tienes que implementar el método. 178 00:06:08,230 --> 00:06:09,410 No pasa nada. 179 00:06:09,990 --> 00:06:10,829 Lo implemento. 180 00:06:14,579 --> 00:06:16,120 Comparable es que es de Java lang. 181 00:06:16,360 --> 00:06:17,040 Y Java lang, 182 00:06:17,639 --> 00:06:18,720 todo lo que tiene Java lang, 183 00:06:18,819 --> 00:06:19,779 no hace falta importarlo. 184 00:06:19,779 --> 00:06:20,959 Se importa por defecto. 185 00:06:22,019 --> 00:06:22,980 Y ahora, 186 00:06:23,839 --> 00:06:25,000 este método 187 00:06:25,000 --> 00:06:27,720 es el que tengo 188 00:06:27,720 --> 00:06:29,600 que implementar. ¿Y este método 189 00:06:29,600 --> 00:06:31,699 qué significa? Tiene un uso 190 00:06:31,699 --> 00:06:33,439 muy concreto que hay que respetar. 191 00:06:35,240 --> 00:06:37,560 Aquí es el objeto reserva que llama al método. 192 00:06:38,779 --> 00:06:39,519 Este es el objeto 193 00:06:39,519 --> 00:06:41,120 reserva pasado por parámetro. 194 00:06:44,230 --> 00:06:45,550 Yo tengo que hacer este 195 00:06:45,550 --> 00:06:47,250 método de tal forma que funcione así. 196 00:06:48,069 --> 00:06:49,370 Si me devuelve negativo 197 00:06:49,370 --> 00:06:51,529 es porque el que llama al método 198 00:06:51,529 --> 00:06:53,410 está antes 199 00:06:53,410 --> 00:06:54,389 que el parámetro. 200 00:06:55,350 --> 00:06:56,769 Si me devuelve cero 201 00:06:56,769 --> 00:06:58,810 es porque son el mismo, están en la misma posición 202 00:06:58,810 --> 00:07:01,889 y si me devuelve un positivo 203 00:07:01,889 --> 00:07:03,410 es 204 00:07:03,410 --> 00:07:05,389 porque el que llama al método está 205 00:07:05,389 --> 00:07:07,509 después, según mi criterio 206 00:07:07,509 --> 00:07:08,689 de ordenación, que el parámetro 207 00:07:08,689 --> 00:07:11,550 entonces yo me las apaño para programar esto 208 00:07:11,550 --> 00:07:13,449 de tal manera que 209 00:07:13,449 --> 00:07:14,670 negativo 210 00:07:14,670 --> 00:07:17,550 menos uno, por ejemplo, si el que lo llamaba 211 00:07:17,550 --> 00:07:18,709 antes que el parámetro 212 00:07:18,709 --> 00:07:20,970 cero, si el mismo 213 00:07:20,970 --> 00:07:22,709 positivo 214 00:07:22,709 --> 00:07:31,379 no, bueno, la burbuja 215 00:07:31,379 --> 00:07:33,540 son dos foranidados que tú vas comparando 216 00:07:33,540 --> 00:07:34,519 vas intercambiando 217 00:07:34,519 --> 00:07:37,279 no, pero no tiene a que ver, es independiente 218 00:07:37,279 --> 00:07:39,500 o sea, esto es un criterio que te devuelve menos uno, cero 219 00:07:39,500 --> 00:07:41,420 o uno, ya está, y luego este método 220 00:07:41,420 --> 00:07:43,339 usa la raíz sor, pero el sor no usa la burbuja 221 00:07:43,339 --> 00:07:45,180 usa otro método, porque la burbuja es un poco 222 00:07:45,180 --> 00:07:47,459 vale, pues aquí podríamos hacer 223 00:07:47,459 --> 00:07:49,180 por ejemplo, si 224 00:07:49,180 --> 00:07:51,680 el objeto que llama al método 225 00:07:51,680 --> 00:07:52,920 punto, mi fecha 226 00:07:52,920 --> 00:07:54,579 get date 227 00:07:54,579 --> 00:07:57,220 Está antes 228 00:07:57,220 --> 00:07:59,220 GetDate tendrá un before o tendrá algo así 229 00:07:59,220 --> 00:07:59,759 IsAfter 230 00:07:59,759 --> 00:08:03,399 Está antes que el objeto este 231 00:08:03,399 --> 00:08:05,319 Pero tendré que hacerle el casting a Reservation 232 00:08:05,319 --> 00:08:07,800 Porque si no, no puedo sacar el método 233 00:08:07,800 --> 00:08:09,480 Reservation 234 00:08:09,480 --> 00:08:17,660 Está antes que 235 00:08:17,660 --> 00:08:19,620 Reservation 236 00:08:19,620 --> 00:08:21,199 Punto 237 00:08:21,199 --> 00:08:22,000 GetDate 238 00:08:22,000 --> 00:08:23,899 Entonces 239 00:08:23,899 --> 00:08:27,120 Devuélveme 240 00:08:27,120 --> 00:08:28,439 Menos uno 241 00:08:28,439 --> 00:08:37,399 Si está después 242 00:08:37,399 --> 00:08:39,500 Devuélveme uno 243 00:08:39,500 --> 00:08:53,440 El save 244 00:08:53,440 --> 00:08:58,480 El save is before 245 00:08:58,480 --> 00:08:59,460 Será, supongo 246 00:08:59,460 --> 00:09:02,039 Is before 247 00:09:02,039 --> 00:09:03,879 Entonces devuélveme uno 248 00:09:03,879 --> 00:09:06,899 Y si no 249 00:09:06,899 --> 00:09:08,320 Devuélveme cero 250 00:09:08,320 --> 00:09:15,789 ¡Hala! 251 00:09:16,250 --> 00:09:18,389 Pues ya tengo un método bien hecho 252 00:09:18,389 --> 00:09:21,370 En el que yo he concretado 253 00:09:21,370 --> 00:09:23,490 mi criterio de ordenación, que es este 254 00:09:23,490 --> 00:09:25,250 porque me da a mí la gana ordenar por fecha 255 00:09:25,250 --> 00:09:27,450 si me da la gana ordenar por otra cosa 256 00:09:27,450 --> 00:09:28,610 lo programaría de otra manera 257 00:09:28,610 --> 00:09:30,129 y ahora 258 00:09:30,129 --> 00:09:32,470 el Arrays.sort 259 00:09:32,470 --> 00:09:36,070 perdone usted 260 00:09:36,070 --> 00:09:37,629 ¿dónde está Reservation? 261 00:09:37,830 --> 00:09:37,990 aquí 262 00:09:37,990 --> 00:09:41,250 sí, sí, sí 263 00:09:41,250 --> 00:09:42,529 cuando quite 264 00:09:42,529 --> 00:09:45,750 toda la morralla, bueno sin ofender 265 00:09:45,750 --> 00:09:46,909 Jimmy, no es que sea morralla 266 00:09:46,909 --> 00:09:49,750 el resto, cuando quite lo que no hemos visto 267 00:09:49,750 --> 00:09:51,509 para que la gente no abra eso y no diga 268 00:09:51,509 --> 00:09:52,149 ¿pero qué es esto? 269 00:09:54,049 --> 00:09:55,110 que me vaya para acá 270 00:09:55,110 --> 00:09:57,750 de hecho me falta 271 00:09:57,750 --> 00:09:58,509 un paréntesis 272 00:09:58,509 --> 00:10:14,440 vale, y ahora ya 273 00:10:14,440 --> 00:10:18,600 este método, el del show 274 00:10:18,600 --> 00:10:19,799 no sé qué 275 00:10:19,799 --> 00:10:21,899 y ya nos vamos 276 00:10:21,899 --> 00:10:24,320 este 277 00:10:24,320 --> 00:10:26,320 ¿Sort qué hace? 278 00:10:27,620 --> 00:10:29,500 Lo primero que hace es comprobar 279 00:10:29,500 --> 00:10:31,240 si esto es ordenable. 280 00:10:31,480 --> 00:10:33,139 Porque como vea que no implementa 281 00:10:33,139 --> 00:10:35,080 comparable, error de ejecución. Te dice, no, 282 00:10:35,419 --> 00:10:35,840 me niego. 283 00:10:37,460 --> 00:10:39,240 Y ahora ya, cuando ya ha visto que es 284 00:10:39,240 --> 00:10:41,240 comparable, lo ordena según 285 00:10:41,240 --> 00:10:43,259 ese criterio. Y te deja el array 286 00:10:43,259 --> 00:10:45,340 ordenado. Y luego ya tendríamos 287 00:10:45,340 --> 00:10:47,320 que pasar a mostrarlo. 288 00:10:47,399 --> 00:10:49,200 Pero bueno, eso ya... 289 00:10:49,200 --> 00:10:51,240 Ahora ya lo mostraríamos y listo. 290 00:10:58,870 --> 00:10:59,350 Observación. 291 00:10:59,350 --> 00:11:01,490 como tienes un toString 292 00:11:01,490 --> 00:11:03,110 pues hala 293 00:11:03,110 --> 00:11:04,570 ya está, ¿vale? 294 00:11:05,090 --> 00:11:07,750 entonces, la arquitectura de herencia y de implementación 295 00:11:07,750 --> 00:11:09,549 de terapias está en todas partes, tenemos que 296 00:11:09,549 --> 00:11:11,769 incorporarnos a ella continuamente 297 00:11:11,769 --> 00:11:12,250 ¿vale? 298 00:11:14,480 --> 00:11:15,240 venga, nos vamos