1 00:00:00,820 --> 00:00:06,320 si habláis me dais la posibilidad el permiso para que es grave vale vamos a 2 00:00:06,320 --> 00:00:11,939 crear una clase persona que ahora vamos a utilizar vale esta clase persona le 3 00:00:11,939 --> 00:00:20,260 vamos a poner algunas cosillas le vamos a poner que tiene una string nombre un 4 00:00:20,260 --> 00:00:41,460 un int edad, lo de clásico, y public persona de string n int e, y esto me crea un dis.nombre 5 00:00:41,460 --> 00:00:46,579 es igual a n, dis.edad es igual a e. ¿Vale? Más o menos. 6 00:00:46,579 --> 00:00:52,659 Ok, lo que yo quiero hacer es crear una colección de personas 7 00:00:52,659 --> 00:00:53,479 ¿Vale? 8 00:00:53,700 --> 00:00:59,460 Y luego quiero crearme un metodillo que ordene estas personas 9 00:00:59,460 --> 00:01:02,380 ¿Parece bien? 10 00:01:03,299 --> 00:01:03,500 ¿Sí? 11 00:01:03,740 --> 00:01:04,900 Ejercicio sencillo 12 00:01:04,900 --> 00:01:10,560 Pero luego a partir de allí vamos a ver cómo podemos mejorar un poquito las cosas 13 00:01:10,560 --> 00:01:10,819 ¿Vale? 14 00:01:12,719 --> 00:01:21,200 Vale 15 00:01:21,200 --> 00:01:23,799 Entonces vamos a hacer un main 16 00:01:23,799 --> 00:01:28,379 Aquí ponemos un main 17 00:01:28,379 --> 00:01:33,359 vale, entonces aquí nosotros 18 00:01:33,359 --> 00:01:35,719 creamos una colección y metemos dentro personas 19 00:01:35,719 --> 00:01:39,519 ¿qué 20 00:01:39,519 --> 00:01:40,540 sobre 21 00:01:40,540 --> 00:01:43,480 ¿qué colección queréis usar? 22 00:01:49,299 --> 00:01:50,540 hacer una lista de personas 23 00:01:50,540 --> 00:01:52,439 un conjunto de personas 24 00:01:52,439 --> 00:01:54,680 si queréis usar 25 00:01:54,680 --> 00:01:55,120 una 26 00:01:55,120 --> 00:01:58,079 esto es más bien sobre 27 00:01:58,079 --> 00:02:00,400 no es sobre maps, luego hacemos 28 00:02:00,400 --> 00:02:01,400 un ejercicio de maps 29 00:02:01,400 --> 00:02:02,280 ¿vale? 30 00:02:05,000 --> 00:02:09,219 la cuestión es, si tenéis una colección 31 00:02:09,219 --> 00:02:14,039 que no hemos usado que queréis usar que si yo el asset o preferís usar el 32 00:02:14,039 --> 00:02:19,460 arre list lo dejo más fácil arre list 33 00:02:19,460 --> 00:02:25,000 linked list son igual estas dos son prácticamente lo mismo de hecho puede 34 00:02:25,000 --> 00:02:40,340 usar una list a ver que había usado ya aquí arre list 35 00:02:40,340 --> 00:02:47,000 da igual da igual no es eso lo que vamos a mirar hagamos una lista luego lo 36 00:02:47,000 --> 00:02:55,280 complicamos en otro momento hagamos una lista de personas personas es igual a new array list 37 00:02:55,280 --> 00:03:12,699 de persona clic clic vale vale entonces tenemos esta persona de aquí añado unas personas al azar 38 00:03:12,699 --> 00:03:33,060 vale persona perdón personas punto ad de new persona de algo y ponemos sara 40 39 00:03:33,060 --> 00:03:46,370 ponemos antonio 24 y ponemos 40 00:03:46,370 --> 00:03:57,360 quizá 45 vale he puesto personas podrían ser 23 me da igual es para crear una persona una 41 00:03:57,360 --> 00:04:04,560 lista vale ahora yo tengo esta esta lista de aquí lo que quiero es un metodito que pille 42 00:04:04,560 --> 00:04:16,540 estas personas y esta lista y las ordene vale entonces aquí yo tendré un ordenar personas 43 00:04:16,540 --> 00:04:26,860 este ordenar a lo mejor puedo que me devuelva algo sí y podría hacer que personas es igual 44 00:04:26,860 --> 00:04:59,329 a ordenar personas si son personas entonces la idea es la siguiente sin ordenar y está ordenada 45 00:04:59,329 --> 00:05:07,199 return personas 46 00:05:07,199 --> 00:05:09,000 ay 47 00:05:09,000 --> 00:05:14,050 hay error 48 00:05:14,050 --> 00:05:16,589 a ver si haga este de aquí 49 00:05:16,589 --> 00:05:40,199 cuando ayer hice algo 50 00:05:40,199 --> 00:05:41,100 y me cargué 51 00:05:41,100 --> 00:06:24,540 vale, he cambiado 52 00:06:24,540 --> 00:06:26,360 de proyecto para que funcione 53 00:06:26,360 --> 00:06:28,360 porque el otro no sé por qué tiene algún parámetro 54 00:06:28,360 --> 00:06:29,920 que no me funciona, no quiero perder tiempo 55 00:06:29,920 --> 00:06:32,120 pues cuando lanzo este 56 00:06:32,120 --> 00:06:34,019 programa me sale este de aquí 57 00:06:34,019 --> 00:06:37,629 ¿cómo lo mejoro? ¿qué hago? 58 00:06:47,009 --> 00:06:47,170 vale 59 00:06:47,170 --> 00:06:49,829 empezamos por aquí 60 00:06:49,829 --> 00:06:52,129 me pongo aquí, botón derecho 61 00:06:52,129 --> 00:06:53,850 source, toString 62 00:06:53,850 --> 00:06:55,709 que quiero que aparezca 63 00:06:55,709 --> 00:06:58,209 nombre, edad, lo genero 64 00:06:58,209 --> 00:06:59,629 pues ya está 65 00:06:59,629 --> 00:07:02,089 no, no me sirve, toString, aquí está 66 00:07:02,089 --> 00:07:04,230 ¿vale? entonces me escribirá 67 00:07:04,230 --> 00:07:06,250 la persona, nombre, cosas así 68 00:07:06,250 --> 00:07:08,470 si no me gusta, porque a lo mejor esto sale 69 00:07:08,470 --> 00:07:09,769 muy grande 70 00:07:09,769 --> 00:07:12,389 pues entonces le pongo 71 00:07:12,389 --> 00:07:14,509 directamente el nombre 72 00:07:14,509 --> 00:07:19,019 más 73 00:07:19,019 --> 00:07:21,319 entre paréntesis la edad. 74 00:07:29,980 --> 00:07:31,160 Entonces, ahora me sale así. 75 00:07:32,360 --> 00:07:33,660 No quiero esta coma. 76 00:07:35,839 --> 00:07:36,660 Ahora me sale así. 77 00:07:38,199 --> 00:07:39,399 ¿Sí? Así veo 78 00:07:39,399 --> 00:07:41,779 mi cosa. Claro, como mi programa 79 00:07:41,779 --> 00:07:43,420 ordenar no hace nada, 80 00:07:44,699 --> 00:07:45,740 pues entonces no hace nada. 81 00:07:46,579 --> 00:07:46,779 ¿Sí? 82 00:07:47,420 --> 00:07:48,779 Ok. Vale. 83 00:07:51,480 --> 00:07:52,120 Metámonos 84 00:07:52,120 --> 00:07:53,240 aquí. 85 00:07:53,240 --> 00:07:55,019 ¿Cómo puedo ordenar 86 00:07:55,019 --> 00:08:01,259 esta cosa? Lo hacemos antes 87 00:08:01,259 --> 00:08:02,439 De la versión fácil 88 00:08:02,439 --> 00:08:04,220 Vale 89 00:08:04,220 --> 00:08:07,279 ¿Vosotros os acordáis que 90 00:08:07,279 --> 00:08:07,939 Arrays 91 00:08:07,939 --> 00:08:11,579 Tenía un metodillo para ordenar? 92 00:08:12,839 --> 00:08:15,519 Pues las colecciones tienen un metodillo 93 00:08:15,519 --> 00:08:16,740 Para ordenar 94 00:08:16,740 --> 00:08:17,579 Que es collections 95 00:08:17,579 --> 00:08:18,839 ¿Vale? 96 00:08:20,399 --> 00:08:22,720 Collections.sort 97 00:08:22,720 --> 00:08:24,579 ¿Si? 98 00:08:25,339 --> 00:08:27,240 En collections.sort 99 00:08:27,240 --> 00:08:28,519 Le puedo pasar 100 00:08:28,519 --> 00:08:30,199 Personas 101 00:08:30,199 --> 00:08:32,740 esto se enfada 102 00:08:32,740 --> 00:08:35,639 el método sort de list 103 00:08:35,639 --> 00:08:37,019 en el connection es aplicable 104 00:08:37,019 --> 00:08:39,240 a list de persona 105 00:08:39,240 --> 00:08:44,620 porque tendré que ponerle 106 00:08:44,620 --> 00:08:46,019 aquí persona 107 00:08:46,019 --> 00:08:49,559 no 108 00:08:49,559 --> 00:08:52,600 a ver 109 00:08:52,600 --> 00:08:55,100 como se usa esto 110 00:08:55,100 --> 00:08:58,460 este aquí me está diciendo que el método 111 00:08:58,460 --> 00:09:00,080 sort de la list 112 00:09:00,080 --> 00:09:02,799 de tipo 113 00:09:02,799 --> 00:09:04,539 colecciones no es aplicable 114 00:09:04,539 --> 00:09:06,840 al argumento list de persona 115 00:09:06,840 --> 00:09:09,159 ¿Y por qué? 116 00:09:11,289 --> 00:09:12,409 Vamos a ver la API 117 00:09:12,409 --> 00:09:13,669 Vamos a ver qué me dice 118 00:09:13,669 --> 00:09:20,159 API Collections Java 119 00:09:20,159 --> 00:09:24,159 22 120 00:09:24,159 --> 00:09:30,960 Entonces, estos son 121 00:09:30,960 --> 00:09:32,940 Esta es como una clase comodín 122 00:09:32,940 --> 00:09:34,860 Para gestionar colecciones 123 00:09:34,860 --> 00:09:37,440 Que me da varios métodos 124 00:09:37,440 --> 00:09:38,980 Sobre el que puedo utilizar 125 00:09:38,980 --> 00:09:40,320 Las colecciones 126 00:09:40,320 --> 00:09:42,940 Tipo, dame el máximo de una colección 127 00:09:42,940 --> 00:09:44,139 Dame el mínimo de una colección 128 00:09:44,139 --> 00:10:16,610 O hazme un sort, ¿vale? Ah, ok, ahora lo sé. ¿Por qué creéis que se va a enfadar? ¿Vale? Este es un método que organiza, ¿sí? Lo que tiene que hacer es, sustancialmente, pillarme las personas y decir, oye, mila, ordénamela. ¿En qué sentido? 129 00:10:16,610 --> 00:10:40,330 Es que hay un criterio de ordenación para personas. No sabemos cómo se ordenan las personas, justo. Entonces la pregunta es, ¿cómo puede existir un método sort que ordene cosas sin saber si estas cosas son ordenadas o no? 130 00:10:40,330 --> 00:10:59,730 Y en el momento en que tú sabes, estableces un orden, ¿cómo puede sort saber cuál es el orden? ¿Qué podríamos hacer nosotros en sort si fuéramos nosotros el que implementan sort para decir, oye, mira, lo que me estás pasando es ordenable? 131 00:10:59,730 --> 00:11:24,159 Pero entonces tienes que rehacerlo desde cero. Y nosotros no queremos rehacerlo desde cero. Porque entonces por eso me hago yo mi programa aquí, que es la versión difícil en el sentido de hacerlo nosotros el sort. 132 00:11:24,159 --> 00:11:29,649 efectivamente, o sea 133 00:11:29,649 --> 00:11:32,990 ¿qué pensáis que pilla como parámetro 134 00:11:32,990 --> 00:11:34,509 el método sort? 135 00:11:34,870 --> 00:11:38,960 una lista cualquiera 136 00:11:38,960 --> 00:11:41,779 una colección cualquiera 137 00:11:41,779 --> 00:11:46,419 repito la pregunta 138 00:11:46,419 --> 00:11:49,320 ¿quién ha hecho sort? 139 00:11:50,000 --> 00:11:50,220 ¿vale? 140 00:11:50,480 --> 00:11:52,580 que supuestamente me ordena las cosas 141 00:11:52,580 --> 00:11:56,080 ¿pensáis que como parámetro aquí 142 00:11:56,080 --> 00:11:57,759 en su definición ha puesto 143 00:11:57,759 --> 00:12:00,179 ponme una colección cualquiera y yo te la ordeno? 144 00:12:01,379 --> 00:12:02,960 no, no podría ser eso 145 00:12:02,960 --> 00:12:23,159 ¿Vale? Porque, por ejemplo, si no me habría ordenado esta de aquí, pero esta de aquí no me la puede ordenar. ¿Por qué no me la puede ordenar? Porque persona no se sabe cómo se ordena. Entonces, ¿cómo podría yo estar seguro que lo que me pases aquí, la lista que me pases aquí, sea posible ordenarla? 146 00:12:23,159 --> 00:12:25,960 haciendo comparto, es decir 147 00:12:25,960 --> 00:12:28,779 que parámetro le pondría 148 00:12:28,779 --> 00:12:30,299 yo a sort, es decir 149 00:12:30,299 --> 00:12:32,500 el parámetro que me das tiene que ser un 150 00:12:32,500 --> 00:12:34,279 una colección, ¿de qué? 151 00:12:36,759 --> 00:12:38,179 de enteros, entonces solo ordeno 152 00:12:38,179 --> 00:12:40,500 los enteros, un string yo no puedo 153 00:12:40,500 --> 00:12:46,629 cualquier cosa que yo le pase 154 00:12:46,629 --> 00:12:48,730 que se ordene, y para estar seguro 155 00:12:48,730 --> 00:12:50,210 que lo que me pases tú 156 00:12:50,210 --> 00:12:51,710 es ordenable 157 00:12:51,710 --> 00:12:54,789 quiere decir que el tipo 158 00:12:54,789 --> 00:12:56,450 de las listas 159 00:12:56,450 --> 00:12:58,610 o de las colecciones que me pases es una colección de 160 00:12:58,610 --> 00:13:02,250 ¿Ojetos de qué tipo? 161 00:13:03,330 --> 00:13:05,450 ¿De string? Pues ordenaría solo string 162 00:13:05,450 --> 00:13:07,149 ¿Integer? Ordenaría solo integer 163 00:13:07,149 --> 00:13:09,769 ¿Persona? Pues persona ni siquiera la puedo ordenar 164 00:13:09,769 --> 00:13:10,629 ¿Cómo puedo 165 00:13:10,629 --> 00:13:12,629 Decir 166 00:13:12,629 --> 00:13:15,710 En general que cualquier cosa 167 00:13:15,710 --> 00:13:16,990 Que tú me pongas aquí 168 00:13:16,990 --> 00:13:18,730 Seguramente yo la puedo ordenar 169 00:13:18,730 --> 00:13:26,919 Con un tipo genérico 170 00:13:26,919 --> 00:13:28,679 Si no 171 00:13:28,679 --> 00:13:30,419 Porque 172 00:13:30,419 --> 00:13:35,600 ¿Qué hace que un objeto 173 00:13:35,600 --> 00:13:38,340 Tú has contestado 174 00:13:38,340 --> 00:13:40,740 Me falta el siguiente paso. 175 00:13:41,100 --> 00:13:42,240 O sea, yo tengo un método. 176 00:13:42,700 --> 00:13:44,580 Va a recibir una lista, ¿vale? 177 00:13:44,720 --> 00:13:47,940 Pero si yo pusiera una lista de cualquier cosa, una lista de T, 178 00:13:48,220 --> 00:13:50,580 yo habría podido pasarle lista de personas. 179 00:13:52,059 --> 00:13:56,059 Y habría tenido el problema que personas no las puedo ordenar. 180 00:13:57,019 --> 00:14:00,500 Entonces, ¿cómo puedo decir, no, mira, no me pases cualquier lista? 181 00:14:00,759 --> 00:14:05,120 Porque las listas de objetos no ordenables, yo no puedo ordenarlos. 182 00:14:05,799 --> 00:14:09,480 Si no me dices un criterio de ordenación, yo no lo puedo hacer. 183 00:14:09,480 --> 00:14:15,480 Pero yo tengo una forma de decirte, oye, mira, dame una lista de objetos especiales 184 00:14:15,480 --> 00:14:19,019 que sí tienen que tener un criterio de ordenación. 185 00:14:20,440 --> 00:14:22,779 Y a partir de allí yo puedo hacer lo que me haga la gana. 186 00:14:26,000 --> 00:14:26,399 No, ¿eh? 187 00:14:26,840 --> 00:14:31,149 Pues vamos a verlo aquí. 188 00:14:32,850 --> 00:14:37,259 ¿Qué pilla list? 189 00:14:37,259 --> 00:14:59,830 El concepto es que los tipos que pongo aquí deberían ser comparable. Si los tipos que pongo aquí son comparable, ¿vale? All elements in the list, más simplemente de comparable interface. 190 00:14:59,830 --> 00:15:03,210 entonces yo puedo 191 00:15:03,210 --> 00:15:05,289 si tú me pasas un list 192 00:15:05,289 --> 00:15:07,110 de un objeto y este objeto es 193 00:15:07,110 --> 00:15:09,190 de tipo comparable, es una instancia comparable 194 00:15:09,190 --> 00:15:10,830 que no puede ser porque es una interfaz 195 00:15:10,830 --> 00:15:13,490 pero ¿os acordáis que podía usar las referencias 196 00:15:13,490 --> 00:15:15,289 como instancias 197 00:15:15,289 --> 00:15:17,110 y cosas por el estilo? Si yo te digo 198 00:15:17,110 --> 00:15:19,190 el objeto que me pones 199 00:15:19,190 --> 00:15:21,029 aquí dentro tiene que ser un comparable 200 00:15:21,029 --> 00:15:23,250 lo que me estás 201 00:15:23,250 --> 00:15:25,190 diciendo es que dentro tiene que tener 202 00:15:25,190 --> 00:15:27,110 un compareTo y si tiene 203 00:15:27,110 --> 00:15:29,190 el compareTo yo puedo usar el compareTo 204 00:15:29,190 --> 00:15:31,350 para decir si esto viene antes que esto. 205 00:15:33,419 --> 00:15:35,460 Entonces, si me das un list de persona, 206 00:15:35,899 --> 00:15:36,860 yo no te lo acepto. 207 00:15:37,259 --> 00:15:39,080 Pero si me das un list de persona 208 00:15:39,080 --> 00:15:41,419 que implementa comparable, 209 00:15:42,419 --> 00:15:43,899 o sea, si me estás dando sustancialmente 210 00:15:43,899 --> 00:15:45,059 un objeto comparable, 211 00:15:46,320 --> 00:15:48,379 pues entonces sí ahora sé pillar a esta persona, 212 00:15:48,519 --> 00:15:50,440 sé decirle compare to y hacerlo. 213 00:15:51,080 --> 00:15:52,299 ¿Me entendéis lo que quiero decir? 214 00:15:53,220 --> 00:15:54,100 Esto es interfaces. 215 00:15:59,350 --> 00:16:01,409 Entonces, ¿por qué se enfada este de aquí? 216 00:16:01,570 --> 00:16:01,870 Creo. 217 00:16:01,870 --> 00:16:04,870 porque sort no admite 218 00:16:04,870 --> 00:16:06,049 lista de personas 219 00:16:06,049 --> 00:16:08,909 porque persona no implementa comparable 220 00:16:08,909 --> 00:16:12,759 vamos a 221 00:16:12,759 --> 00:16:14,200 implementarle comparable 222 00:16:14,200 --> 00:16:16,679 implements comparable 223 00:16:16,679 --> 00:16:20,049 ahora le voy a decir 224 00:16:20,049 --> 00:16:22,370 mira persona, te voy a añadir 225 00:16:22,370 --> 00:16:23,889 algo que permite 226 00:16:23,889 --> 00:16:26,090 dame dos personas y te digo 227 00:16:26,090 --> 00:16:27,669 quien viene antes y quien viene después 228 00:16:27,669 --> 00:16:30,370 esto 229 00:16:30,370 --> 00:16:31,570 se enfada porque dice 230 00:16:31,570 --> 00:16:33,629 si me has dicho que implementas comparable 231 00:16:33,629 --> 00:16:41,870 pero no tienes el método compare to vale comparamos creamos los métodos cuando creo 232 00:16:41,870 --> 00:16:49,809 compare to me da un objeto vale porque compare to siempre se compara con un objeto y aquí hay 233 00:16:49,809 --> 00:16:55,570 que hacer cosas como ver si el objeto es de la misma clase ver si hay cosas por el estilo vale 234 00:16:55,570 --> 00:17:16,640 Ahora vamos a verlo. No sé si esto tengo suerte, me da Compertú. No, lo tengo que hacer yo el Compertú. Entonces, el concepto es, yo tengo dos objetos aquí dentro. Esta es la interfaz de Compr y ya lo hemos hecho. Pero ya que estamos, la repasamos. 235 00:17:16,640 --> 00:17:56,500 ¿Vale? Entonces, yo aquí tengo dos objetos. ¿Cuál es el primer objeto? This. Esta persona. ¿Y la voy a comparar con qué objeto? O. Estos son mis dos objetos. ¿Sí? Un objeto que es this y un objeto que es o. Quiero comparar estos dos. ¿Sí? 236 00:17:56,500 --> 00:18:00,599 El primer problema que tengo es que esto es un objeto cualquiera. 237 00:18:02,200 --> 00:18:05,619 Y si no es comparable, debería pasar algo. 238 00:18:05,720 --> 00:18:11,579 Vamos a ver un momento si nos ayuda Java API comparable. 239 00:18:13,099 --> 00:18:20,099 Espera, que aquí a lo mejor es... 240 00:18:20,099 --> 00:18:24,700 Si os acordáis, comparable, que era esta interfaz de aquí, 241 00:18:24,859 --> 00:18:29,099 dice implementa compare to, implementa compare to de un objeto. 242 00:18:29,099 --> 00:18:32,539 lo que tienes que hacer es devolver un entero 243 00:18:32,539 --> 00:18:34,920 y cuando devuelves un entero 244 00:18:34,920 --> 00:18:37,559 le tienes que decir 245 00:18:37,559 --> 00:18:41,319 cero si son equivalentes 246 00:18:41,319 --> 00:18:45,680 menor si el primero es anterior que el segundo 247 00:18:45,680 --> 00:18:47,740 y un número mayor que cero 248 00:18:47,740 --> 00:18:50,079 si el segundo es anterior que el primero 249 00:18:50,079 --> 00:18:51,019 ¿os acordáis, no? 250 00:18:52,140 --> 00:18:54,099 también, si yo miro 251 00:18:54,099 --> 00:18:58,799 comparable tiene un tipo genérico 252 00:18:58,799 --> 00:19:01,859 entonces aquí tengo dos opciones 253 00:19:01,859 --> 00:19:03,740 o lo dejo así como estoy 254 00:19:03,740 --> 00:19:05,940 y compruebo allí dentro 255 00:19:05,940 --> 00:19:07,160 si 256 00:19:07,160 --> 00:19:09,880 si esto es de mi tipo 257 00:19:09,880 --> 00:19:10,900 correcto 258 00:19:10,900 --> 00:19:13,700 ahora lo hacemos si queréis 259 00:19:13,700 --> 00:19:15,799 o digo que no es que implementas 260 00:19:15,799 --> 00:19:17,019 comparable cualquiera 261 00:19:17,019 --> 00:19:19,299 implementas comparable de persona 262 00:19:19,299 --> 00:19:24,849 porque si os fijáis 263 00:19:24,849 --> 00:19:29,759 la interfaz 264 00:19:29,759 --> 00:19:31,880 es comparable de un tipo genérico 265 00:19:31,880 --> 00:19:33,720 y luego aquí 266 00:19:33,720 --> 00:19:36,019 lo que me hace es comparar 267 00:19:36,019 --> 00:19:37,380 con ese tipo genérico. 268 00:19:42,140 --> 00:19:44,099 ¿Lo veis que comparó? Entonces, si yo le digo 269 00:19:44,099 --> 00:19:45,759 que eres comparable con otra persona, 270 00:19:45,900 --> 00:19:47,559 pues aquí me hace tras solo una persona. 271 00:19:48,359 --> 00:19:49,920 Y me quito el problema de que estoy 272 00:19:49,920 --> 00:19:51,079 comparando con un objeto. 273 00:19:51,559 --> 00:19:54,160 Si lo quisiera hacer así, fijaos que 274 00:19:54,160 --> 00:19:56,119 si yo intento 275 00:19:56,119 --> 00:19:58,119 hacer un... 276 00:19:59,299 --> 00:20:00,559 comparar 277 00:20:00,559 --> 00:20:01,920 este objeto, una persona, 278 00:20:02,059 --> 00:20:03,960 con un gato, lo que 279 00:20:03,960 --> 00:20:06,099 debería pasar es esto. 280 00:20:06,099 --> 00:20:09,630 ClassCastException 281 00:20:09,630 --> 00:20:11,650 Tú me estás diciendo 282 00:20:11,650 --> 00:20:12,990 Que me has pasado un gato 283 00:20:12,990 --> 00:20:15,190 Pero estabas trabajando con personas 284 00:20:15,190 --> 00:20:17,190 Pues cuando yo intento hacer 285 00:20:17,190 --> 00:20:19,710 Un casting de este objeto que me has pasado 286 00:20:19,710 --> 00:20:21,750 A persona, pero no es una persona 287 00:20:21,750 --> 00:20:22,910 Porque me has pasado un gato 288 00:20:22,910 --> 00:20:23,849 Pues exploto 289 00:20:23,849 --> 00:20:25,829 ¿Sí? 290 00:20:26,410 --> 00:20:29,170 Y esto se podría lograr en nuestro 291 00:20:29,170 --> 00:20:31,390 En nuestro ejemplo 292 00:20:31,390 --> 00:20:32,230 Sin persona 293 00:20:32,230 --> 00:20:34,210 Así 294 00:20:34,210 --> 00:20:37,029 Simplemente haciendo, vale, paso 1 295 00:20:37,029 --> 00:20:40,150 personaP es igual 296 00:20:40,150 --> 00:20:41,470 a persona 297 00:20:41,470 --> 00:20:43,329 de O 298 00:20:43,329 --> 00:20:47,450 esta cosa de aquí 299 00:20:47,450 --> 00:20:50,329 lo que está intentando hacer es convertirme 300 00:20:50,329 --> 00:20:51,130 este objeto 301 00:20:51,130 --> 00:20:53,029 en una persona 302 00:20:53,029 --> 00:20:55,910 si este objeto es una persona 303 00:20:55,910 --> 00:20:57,269 funcionará 304 00:20:57,269 --> 00:21:00,410 si este objeto no es una persona, ¿qué lanzará? 305 00:21:02,569 --> 00:21:03,210 una excepción 306 00:21:03,210 --> 00:21:05,029 ¿qué tipo de excepción? 307 00:21:07,140 --> 00:21:08,000 classCasterException 308 00:21:08,000 --> 00:21:10,119 y entonces es 309 00:21:10,119 --> 00:21:24,539 Y es lo que yo me espero, porque me lo dice el API, ¿vale? El API me dice, oye, mira, que si el objeto que has pasado no se puede comparar con este objeto porque no son del mismo tipo, lanza un class cast exception. 310 00:21:24,539 --> 00:21:28,650 perfecto 311 00:21:28,650 --> 00:21:31,329 para hacerlo más bonito 312 00:21:31,329 --> 00:21:34,849 y más sencillo para nosotros 313 00:21:34,849 --> 00:21:36,990 y así repasamos y usamos también 314 00:21:36,990 --> 00:21:37,710 los tipos 315 00:21:37,710 --> 00:21:40,970 voy a decirle 316 00:21:40,970 --> 00:21:43,150 que implementa comparable de persona 317 00:21:43,150 --> 00:21:44,670 fijaos que ahora cuando le digo 318 00:21:44,670 --> 00:21:47,190 añádeme los métodos no implementados 319 00:21:47,190 --> 00:21:49,369 no me añade de objeto 320 00:21:49,369 --> 00:21:50,890 me añade de persona 321 00:21:50,890 --> 00:21:53,170 porque ahora estoy trabajando con persona 322 00:21:53,170 --> 00:21:54,329 si 323 00:21:54,329 --> 00:21:56,630 ¿Están de acuerdo? 324 00:21:57,309 --> 00:21:58,910 Entonces, ahora tengo dos objetos. 325 00:21:59,410 --> 00:22:11,730 Tengo el objeto dis de tipo hola, persona. 326 00:22:12,130 --> 00:22:16,509 Y tengo el objeto o de tipo persona. 327 00:22:17,069 --> 00:22:17,609 Dos personas. 328 00:22:19,269 --> 00:22:22,599 ¿Cómo ordeno las personas? 329 00:22:26,460 --> 00:22:28,039 Por nombre, claramente. 330 00:22:31,759 --> 00:22:33,019 Por nombre, claramente. 331 00:22:33,019 --> 00:22:56,059 ¿Sí? Entonces, ¿cómo ordeno, cómo digo si una persona es más, o sea, viene antes o después de otra persona? Que no, que no, que no. ¿Por nombre? ¿Por la edad? No, por la edad no, por nombre. ¿Por la edad? No, tampoco por la edad, por nombre. 332 00:22:56,940 --> 00:22:59,400 ¿Cómo le digo qué tengo que escribir aquí? 333 00:22:59,460 --> 00:23:03,140 ¿Qué operaciones tengo que decir para decir tengo dis y tengo 0? 334 00:23:03,559 --> 00:23:04,440 Tengo o, perdón. 335 00:23:04,859 --> 00:23:09,099 Quiero, si dis viene antes de o, un número negativo. 336 00:23:09,700 --> 00:23:14,299 Si o, dis y o van al mismo nivel, pues son el mismo nombre, 337 00:23:14,380 --> 00:23:16,440 tienen el mismo nombre, pues tiene que dar un 0. 338 00:23:16,440 --> 00:23:21,839 Y si en vez va antes o que dis, pues tendré que dar un número positivo. 339 00:23:21,839 --> 00:24:15,049 char t1 es igual a dis.nombre.charat0, punto y coma, sí, siguen existiendo los char, char oc, pongamos este c, es igual a o.nombre.charat0, ¿eh? 340 00:24:15,990 --> 00:24:19,990 Ahora, si os acordáis, estos señores eran también números. 341 00:24:21,509 --> 00:24:29,869 Entonces, a lo mejor yo lo que puedo hacer es devuelve tc menos c, o c menos tc. 342 00:24:30,230 --> 00:24:50,049 Si esta es una a, pongamos, si esta es una a, 28, y esta es una z, 30, más grande que 28, 40, 343 00:24:50,049 --> 00:24:54,670 Pues si hago esto menos esto, saldrá positivo 344 00:24:54,670 --> 00:24:59,089 Y entonces, esto es mayor 345 00:24:59,089 --> 00:25:00,710 Pues al revés, ¿no? 346 00:25:00,769 --> 00:25:01,210 Debería ser 347 00:25:01,210 --> 00:25:05,670 Eso, no sé si es TC menos OC o OC menos TC 348 00:25:05,670 --> 00:25:07,089 Pero eso lo miramos, ¿vale? 349 00:25:07,750 --> 00:25:09,410 Posiblemente es TC menos OC 350 00:25:09,410 --> 00:25:10,910 Vamos a hacer una prueba 351 00:25:10,910 --> 00:25:21,630 ¿Así o al revés? 352 00:25:22,349 --> 00:25:23,289 Vamos a probarlo 353 00:25:23,289 --> 00:25:24,089 Main 354 00:25:24,089 --> 00:25:26,410 Me hago un pequeño main aquí 355 00:25:26,410 --> 00:25:28,529 De prueba, ¿vale? 356 00:25:28,529 --> 00:25:33,349 donde me creo dos personas, le pregunto COMPARTOO y veo que pasa. 357 00:25:33,650 --> 00:25:33,970 Ya está. 358 00:25:34,869 --> 00:25:42,690 Entonces, persona1 es igual a new persona de AAA22. 359 00:25:43,690 --> 00:25:51,519 Y persona2 es igual a new persona de BBB22. 360 00:25:52,980 --> 00:25:54,839 Tanto esto no lo usa en el COMPARTOO. 361 00:25:54,839 --> 00:26:08,920 Y ahora me pregunto, si eso, 1.2, ¿qué me debería dar? ¿Número positivo, negativo o cero? 362 00:26:12,220 --> 00:26:14,940 Negativo, ¿no? Porque esto viene antes que esto. 363 00:26:17,009 --> 00:26:20,849 Vamos a ver que sale, menos 1. ¡Perfecto! 364 00:26:21,730 --> 00:26:27,509 Y si esto fuera el señor Z, perfecto. 365 00:26:28,369 --> 00:27:05,400 Y si esto fuera el señor Z mayúscula, y esto fuera A, ¿qué opináis? ¿Funciona esto o no? 366 00:27:05,799 --> 00:27:13,910 No sé si hay un caso en el que esto pueda funcionar. 367 00:27:24,099 --> 00:27:28,920 Aquí tenemos mayúsculas y minúsculas. Si os acordáis, la mayúscula y la minúscula venían separadas. 368 00:27:28,920 --> 00:27:35,319 Entonces el riesgo que tengo aquí, que me da un poquito de miedo, es que si uno pilla una mayúscula y uno una minúscula, pues no funcione. 369 00:27:35,420 --> 00:27:36,880 Pero lo puedo solucionar. 370 00:27:36,880 --> 00:27:53,509 cuando pillo el nombre lo pongo en minúscula entonces me da igual que sea mayúscula o 371 00:27:53,509 --> 00:28:08,140 minúscula lo pongo en minúscula y luego lo comparo si no nos complicamos demasiado pero 372 00:28:08,140 --> 00:28:14,519 la idea es esa vale efectivamente si luego ya aquí le pongo asterisco ya la cosa se complica 373 00:28:14,519 --> 00:28:22,579 pero oye seguirá su orden lo pondrá antes o después pero seguirá los órdenes algunos 374 00:28:22,579 --> 00:28:24,400 símbolos lo podrán antes, algunos símbolos 375 00:28:24,400 --> 00:28:26,359 lo pondrán después, pero un orden está 376 00:28:26,359 --> 00:28:28,400 por allí. ¿Sí? Que es el 377 00:28:28,400 --> 00:28:29,559 ordenashi, al fin y al cabo. 378 00:28:30,779 --> 00:28:34,410 ¿Sí? ¿Os gusta esta 379 00:28:34,410 --> 00:28:38,960 cosa? Claro, 380 00:28:39,640 --> 00:28:41,339 fenomenal, porque 381 00:28:41,339 --> 00:28:42,599 nosotros nos gusta 382 00:28:42,599 --> 00:28:43,799 sufrir, 383 00:28:45,579 --> 00:28:46,160 nos gusta 384 00:28:46,160 --> 00:28:48,059 ser, 385 00:28:49,680 --> 00:28:51,500 nos gusta reinventar la rueda 386 00:28:51,500 --> 00:28:53,160 una y otra vez, 387 00:28:53,400 --> 00:28:55,039 y otra vez, y otra vez, 388 00:28:55,279 --> 00:28:57,000 y otra vez, y otra vez. 389 00:28:57,440 --> 00:29:36,990 ya está porque si string implementa comparable qué solución nos parece mejor está o está se 390 00:29:36,990 --> 00:29:43,210 entiende vale el concepto es este de aquí está bien como ejercicio para pensar es esta no es 391 00:29:43,210 --> 00:29:48,269 esta esto es como ejercicio de pensar cómo lo puede hacer y es correcto esto lo hemos hecho 392 00:29:48,269 --> 00:29:54,750 hecho de hecho a uno de los ejercicios que hemos hecho en pasado era de ver si una palabra venía 393 00:29:54,750 --> 00:30:01,650 antes que la otra esto en octubre sí y más o menos lo hacíamos así esta es mi implementación 394 00:30:01,650 --> 00:30:07,650 vale pero yo sé que string o debería que saber que string implementa con perol si no lo sé qué hago 395 00:30:07,650 --> 00:30:10,349 lo busco 396 00:30:10,349 --> 00:30:11,910 me voy aquí 397 00:30:11,910 --> 00:30:14,990 string api 398 00:30:14,990 --> 00:30:17,089 java 22 399 00:30:17,089 --> 00:30:19,670 me voy a string 400 00:30:19,670 --> 00:30:21,730 y voy a preguntarme 401 00:30:21,730 --> 00:30:23,950 ¿esto implementa? ¿qué implementa? 402 00:30:24,009 --> 00:30:25,789 implementa comparable de string 403 00:30:25,789 --> 00:30:27,869 o sea que ya se pueden comparar 404 00:30:27,869 --> 00:30:29,670 dos strings y nosotros hemos dicho 405 00:30:29,670 --> 00:30:31,910 que quiero comparar las personas 406 00:30:31,910 --> 00:30:33,670 en base al nombre, por lo tanto 407 00:30:33,670 --> 00:30:35,589 ¿qué hago? pillo el nombre 408 00:30:35,589 --> 00:30:37,849 de este objeto 409 00:30:37,849 --> 00:30:39,910 y el nombre del objeto que estoy comparando 410 00:30:39,910 --> 00:30:42,009 y comparo estas dos strings 411 00:30:42,009 --> 00:30:43,869 y me quito de encima 412 00:30:43,869 --> 00:30:45,609 de problemas de masada mayúsculas 413 00:30:45,609 --> 00:30:46,970 masada mayúsculas, masada lo que sea 414 00:30:46,970 --> 00:30:49,710 pues uso la forma con que 415 00:30:49,710 --> 00:30:51,730 se comparan dos strings 416 00:30:51,730 --> 00:30:53,490 ya lo han hecho ellos 417 00:30:53,490 --> 00:30:54,529 ¿sí? 418 00:30:56,109 --> 00:30:57,369 entonces esto me dará 419 00:30:57,369 --> 00:30:59,809 el número que me dará, ¿cómo está hecho esto 420 00:30:59,809 --> 00:31:01,670 por debajo? no lo sé, pero sé que 421 00:31:01,670 --> 00:31:03,369 me ordena lexicográficamente 422 00:31:03,369 --> 00:31:05,009 ¿sí? 423 00:31:05,009 --> 00:31:20,309 ¿Dudas? Fijaos en el momento en que este señor es comparable y ha implementado el compareTo, mágicamente mi error del sort que pasaba aquí ha desaparecido. 424 00:31:21,230 --> 00:31:29,730 Porque ahora sort pilla un objeto list de un objeto que es comparable. 425 00:31:29,730 --> 00:31:31,730 Y entonces lo puede comparar. 426 00:31:32,869 --> 00:31:32,970 ¿Vale? 427 00:31:34,609 --> 00:31:35,750 Esto hace algo. 428 00:31:36,430 --> 00:31:36,670 A ver. 429 00:31:43,539 --> 00:31:45,559 Tenía Sara, Antonio y Luisa. 430 00:31:45,940 --> 00:31:47,900 Y ahora tengo Antonio, Luisa y Sara. 431 00:31:49,140 --> 00:31:50,200 Esto ya me lo he ordenado. 432 00:31:50,579 --> 00:31:52,900 Lo que me hace pensar también que sort... 433 00:31:52,900 --> 00:31:53,940 ¿Qué hace sort? 434 00:31:54,700 --> 00:31:55,960 Este método de aquí. 435 00:31:59,579 --> 00:32:04,279 Ordena de menor a mayor, pero me crea una nueva colección y me la devuelve. 436 00:32:07,180 --> 00:32:10,339 Esto está trabajando sobre la propia colección. 437 00:32:10,339 --> 00:32:13,720 Yo no he hecho personas igual esta cosa de aquí 438 00:32:13,720 --> 00:32:15,400 He hecho 439 00:32:15,400 --> 00:32:16,819 Ordename persona 440 00:32:16,819 --> 00:32:18,660 Y automáticamente personas se volverán 441 00:32:18,660 --> 00:32:19,299 Cuidado 442 00:32:19,299 --> 00:32:23,299 Porque si yo quería mantener la original 443 00:32:23,299 --> 00:32:24,599 Ahora la he perdido 444 00:32:24,599 --> 00:32:25,960 Ahora la tengo ordenada 445 00:32:25,960 --> 00:32:33,349 Hacer una copia, ordenar la copia 446 00:32:33,349 --> 00:32:35,490 Utilizar otro tipo de sort 447 00:32:35,490 --> 00:32:37,970 Mirar si hay un sort ya hecho 448 00:32:37,970 --> 00:32:39,869 Que devuelve la cosa 449 00:32:39,869 --> 00:32:41,250 Fijaos también que 450 00:32:41,250 --> 00:32:43,589 El sort, si no me equivoco 451 00:32:43,589 --> 00:32:45,650 si devuelve algo 452 00:32:45,650 --> 00:32:50,089 no, void 453 00:32:50,089 --> 00:32:55,480 por lo tanto no 454 00:32:55,480 --> 00:32:57,839 trabaja sobre esta cosa 455 00:32:57,839 --> 00:32:59,720 entonces efectivamente 456 00:32:59,720 --> 00:33:01,519 si quisiera mantener la original 457 00:33:01,519 --> 00:33:03,799 pues lo que debería hacer posiblemente 458 00:33:03,799 --> 00:33:04,680 es cambiar 459 00:33:04,680 --> 00:33:06,839 el original 460 00:33:06,839 --> 00:33:09,700 copiar el original, hacer una copia 461 00:33:09,700 --> 00:33:10,980 hacer un clone, hacer algo 462 00:33:10,980 --> 00:33:13,579 para copiar esta lista y luego ordenar 463 00:33:13,579 --> 00:33:14,119 otra lista 464 00:33:14,119 --> 00:33:17,160 si, dudas 465 00:33:17,160 --> 00:33:18,839 ¿cómo copio una lista? 466 00:33:30,259 --> 00:33:48,660 si yo hiciera lista 2 y esta persona 2 es igual a personas ahora tengo dos listas tengo dos enlaces 467 00:33:48,660 --> 00:34:01,500 al mismo objeto no he copiado nada que debería hacer es crearme una nueva lista o una nueva 468 00:34:01,500 --> 00:34:09,320 lista de persona vacía hacerme un iterador sobre la vieja por cada objeto meterlo en la nueva y 469 00:34:09,320 --> 00:34:26,199 ahora tengo una copia o me voy a mirar en lista donde estará esto está listo pero no collection 470 00:34:26,199 --> 00:34:33,179 collection list list vamos a ver en list si por si acaso hay un método en lista que me permite copiar 471 00:34:33,179 --> 00:34:45,039 todo esto como por ejemplo copy off copy off a lo mejor man hace algo devuelve una lista 472 00:34:45,039 --> 00:34:50,800 inmodificable contenente los elementos de la colección ya dada es estático vale puedo hacer 473 00:34:50,800 --> 00:34:56,920 list punto copy off de una colección y esto me dará una copia de esta colección y una vez que 474 00:34:56,920 --> 00:35:03,800 tengo la copia una la ordenó en la otra la tengo por ejemplo ya que por aquí si buscáis un poco 475 00:35:03,800 --> 00:35:12,139 métodos interesantes los hay si no os lo complementáis vosotros vale estamos 476 00:35:12,139 --> 00:35:21,349 de acuerdo hasta aquí entonces tengo ordenar que pilla personas la ordena 477 00:35:21,349 --> 00:35:26,369 fenomenal vale ahora tengo las personas ordenadas por nombre pero ahora de 478 00:35:26,369 --> 00:35:37,599 repente no quiero ordenar por nombre quiero ordenar por edad porque me lo 479 00:35:37,599 --> 00:35:42,739 pide el botón de la ventanita que ha pulsado el usuario y ha dicho ahora 480 00:35:42,739 --> 00:35:45,699 Ahora no quiero que ordene por nombre. 481 00:35:46,059 --> 00:35:48,019 Quiero que ordenes por la columna edad. 482 00:35:48,699 --> 00:35:50,119 Entonces quiero ordenar por edad. 483 00:35:50,219 --> 00:35:50,500 ¿Por qué? 484 00:35:50,760 --> 00:35:53,559 Le puedo poner una pantalla al usuario diciendo, 485 00:35:53,639 --> 00:35:54,059 ¿y por qué? 486 00:35:54,559 --> 00:35:56,579 Pero ahora él tendrá sus razones. 487 00:35:58,079 --> 00:36:00,320 O ordenárselo por nombre, diciendo, 488 00:36:00,420 --> 00:36:02,239 por edad, por nombre, porque sí. 489 00:36:02,619 --> 00:36:05,079 Pero los usuarios no suelen ser felices de eso. 490 00:36:06,699 --> 00:36:10,619 Entonces, sí, mensaje. 491 00:36:10,619 --> 00:36:13,619 System.org.pl en la vida no es justa. 492 00:36:14,239 --> 00:36:28,650 Entonces, ahora yo quiero pillar esto, hacer que personas es igual a ordenar por edad personas, y ver qué pasa. 493 00:36:30,550 --> 00:36:34,510 ¿Sí? Y lo voy a hacer si hizo personas otra vez. 494 00:36:37,869 --> 00:36:44,650 Entonces, este señor de aquí, de hecho, tened en cuenta que esto podría ser void. 495 00:36:44,650 --> 00:36:48,349 Y podría ser que no lo guarde aquí. 496 00:36:48,750 --> 00:36:51,510 Porque al fin y al cabo estoy trabajando sobre personas. 497 00:36:52,650 --> 00:36:53,590 ¿Lo veis? 498 00:36:56,780 --> 00:36:58,440 Entonces lo hacemos void. 499 00:37:04,519 --> 00:37:09,980 Como sort modifica esto que le paso, no hace falta guardarlo otra vez. 500 00:37:10,320 --> 00:37:11,139 Ya se ha modificado. 501 00:37:12,139 --> 00:37:14,300 Entonces, ahora tengo esto. 502 00:37:15,940 --> 00:37:16,519 Es parecido. 503 00:37:17,219 --> 00:37:20,800 Esto devuelve una lista, pero es la misma lista que me ha pasado. 504 00:37:21,440 --> 00:37:25,440 Y este de aquí, en vez, trabaja directamente aquí arriba. 505 00:37:25,780 --> 00:37:32,500 La pregunta es, vale, y ahora puedo hacer collection.sort esto. 506 00:37:34,019 --> 00:37:36,099 ¿Qué pasaría si yo hago esto otra vez? 507 00:37:38,340 --> 00:37:38,900 Hace lo mismo. 508 00:37:39,539 --> 00:37:45,320 Pues entonces podría ir a persona y decir, oye, no, a mi persona, no me compares por nombre. 509 00:37:46,699 --> 00:37:48,000 Compárame por otra cosa. 510 00:37:48,000 --> 00:37:53,000 Pero entonces también esto compararía para la otra cosa. 511 00:37:54,500 --> 00:38:05,119 Entonces, ¿qué hago en una situación en la que existen objetos que tienen un orden natural, que es esto, 512 00:38:05,780 --> 00:38:12,019 las personas, el orden natural de las personas que he decidido yo, es que se ordenan por nombre? 513 00:38:14,280 --> 00:38:20,179 Podría haber puesto aquí también, y luego, si el nombre es igual, puedes ordenar también por edad. 514 00:38:20,719 --> 00:38:23,320 No lo sé. Aquí la edad no la tienen consideración. Me da igual. 515 00:38:23,639 --> 00:38:26,780 Pero esto es cómo se ordenan las personas. Las personas se ordenan por nombre. 516 00:38:27,260 --> 00:38:29,860 Es su forma natural de ordenarse. 517 00:38:30,679 --> 00:38:35,599 Pero ahora yo quiero ordenar estas personas con un criterio distinto. 518 00:38:36,039 --> 00:38:36,659 ¿Cómo lo hago? 519 00:38:42,789 --> 00:38:46,769 Pues para hacer esto, y ahora lo hacemos de una forma un poquito fea, 520 00:38:46,769 --> 00:38:50,539 Me crea un objeto 521 00:38:50,539 --> 00:38:53,900 Que es un objeto 522 00:38:53,900 --> 00:38:57,880 Orden 523 00:38:57,880 --> 00:38:58,659 Por 524 00:38:58,659 --> 00:39:00,639 Orden 525 00:39:00,639 --> 00:39:02,079 Por 526 00:39:02,079 --> 00:39:04,599 Edad 527 00:39:04,599 --> 00:39:09,619 Y le digo que este señor 528 00:39:09,619 --> 00:39:11,440 Implementa 529 00:39:11,440 --> 00:39:15,280 Comparator 530 00:39:15,280 --> 00:39:17,599 De persona 531 00:39:17,599 --> 00:39:21,969 La persona me lo pillará 532 00:39:21,969 --> 00:39:25,219 Porto 533 00:39:25,219 --> 00:39:28,829 Y voy a mirar 534 00:39:28,829 --> 00:39:29,929 Que método 535 00:39:29,929 --> 00:39:31,989 Tengo que implementar 536 00:39:31,989 --> 00:39:33,730 El método que tengo que implementar 537 00:39:33,730 --> 00:39:35,110 Es un método 538 00:39:35,110 --> 00:39:37,690 Que compara 539 00:39:37,690 --> 00:39:40,050 Un objeto o uno 540 00:39:40,050 --> 00:39:41,630 Con un objeto o dos 541 00:39:41,630 --> 00:39:43,989 Siendo los dos objetos personas 542 00:39:43,989 --> 00:39:47,630 O sea, es distinto del 543 00:39:47,630 --> 00:39:48,329 Compertú 544 00:39:48,329 --> 00:39:51,030 Compertú pilla un solo 545 00:39:51,030 --> 00:39:53,130 Parámetro 546 00:39:53,130 --> 00:39:54,610 Y compara 547 00:39:54,610 --> 00:39:56,969 Un objeto 548 00:39:56,969 --> 00:39:59,929 Con el objeto pasado por parámetro 549 00:39:59,929 --> 00:40:13,429 La interfaz comparator implementa el método compare, no compare to, que pilla dos parámetros 550 00:40:13,429 --> 00:40:24,440 Y es lo mismo, devuelve o uno, o sea, un número menor, desde que cero, si o uno es menor que o dos 551 00:40:24,440 --> 00:40:31,079 Cero si son iguales y un número mayor si o uno es mayor que o dos 552 00:40:31,079 --> 00:40:41,619 Pero esto me permite sostancialmente establecer otro criterio con el que comparo dos personas 553 00:40:41,619 --> 00:40:43,599 Que por ejemplo en este caso es por edad 554 00:40:43,599 --> 00:40:52,679 Entonces este de aquí lo que devolverá será o1.edad menos o2.edad 555 00:40:52,679 --> 00:40:58,630 Si este tiene 10 años y este tiene 20 me dará un número negativo 556 00:40:58,630 --> 00:41:01,409 Si tiene la misma edad me dará 0 557 00:41:01,409 --> 00:41:04,630 si tengo este de aquí 558 00:41:04,630 --> 00:41:06,429 que tiene 40 años y este tiene 20 559 00:41:06,429 --> 00:41:07,469 me dará un número positivo 560 00:41:07,469 --> 00:41:09,750 ¿se entiende? 561 00:41:10,909 --> 00:41:11,090 ¿sí? 562 00:41:12,070 --> 00:41:14,289 entonces, ¿ahora cómo uso esta cosa? 563 00:41:17,469 --> 00:41:19,309 pues si vosotros vais a 564 00:41:19,309 --> 00:41:21,389 el API, vuestro mejor amigo 565 00:41:21,389 --> 00:41:23,469 y vais a collection 566 00:41:23,469 --> 00:41:25,590 veréis que collection tiene sort 567 00:41:25,590 --> 00:41:27,170 que pilla una lista 568 00:41:27,170 --> 00:41:29,250 si yo uso esto 569 00:41:29,250 --> 00:41:31,090 lo que se está utilizando 570 00:41:31,090 --> 00:41:33,409 es el compare to 571 00:41:33,409 --> 00:41:38,070 el comparable, pero existe también otro sort 572 00:41:38,070 --> 00:41:41,030 que pilla dos parámetros, pilla una lista 573 00:41:41,030 --> 00:41:46,230 y después un objeto de tipo comparator 574 00:41:46,230 --> 00:41:49,849 y si tú me has dado un objeto 575 00:41:49,849 --> 00:41:53,130 de tipo comparator, pues yo lo que hago es 576 00:41:53,130 --> 00:41:57,489 hacer el sort, pero usando esto, o sea voy a 577 00:41:57,489 --> 00:42:01,630 comparar los objetos usando el compare de estos dos objetos 578 00:42:01,630 --> 00:42:09,230 no el COMPERTÚ, o sea que voy a ordenarlo según el criterio de ordenación que me has 579 00:42:09,230 --> 00:42:16,829 dado en el COMPERTÚ. Vamos a verlo. ¿Cómo se usa? Pues esto se usaría más o menos 580 00:42:16,829 --> 00:42:24,909 así. Cuando hago este sort de aquí, que es ordenar por edad, en realidad antes me 581 00:42:24,909 --> 00:42:34,010 Creo un orden por edad e, o es igual a new orden por edad. 582 00:42:34,010 --> 00:42:40,309 Me creo un objeto de tipo orden por edad que implementa comparator. 583 00:42:41,030 --> 00:42:51,260 Entonces aquí le paso como segundo parámetro este objeto. 584 00:42:51,260 --> 00:43:00,659 objeto. Él, dentro, podrá hacer orden.compare y poner aquí dos personas, la persona uno 585 00:43:00,659 --> 00:43:05,840 y la persona dos. Entonces, utilizando este objeto, él puede hacer la comparación de 586 00:43:05,840 --> 00:43:14,940 las personas que están en esta lista. Y entonces me ordena la lista, pero no en base a las 587 00:43:14,940 --> 00:43:21,159 personas al nombre perdón más en base a este nuevo orden definido en este 588 00:43:21,159 --> 00:43:40,889 objeto si dudas porque tú normalmente un objeto lo defines con un comparable y 589 00:43:40,889 --> 00:43:46,829 normalmente cuando tú ordenas ese objeto es bastante común que tú lo ordenes 590 00:43:46,829 --> 00:43:52,769 según el objeto mismo si el que ha desarrollado ese objeto ha decidido 591 00:43:52,769 --> 00:43:58,150 ordenarlo de una determinada forma porque naturalmente se ordena de esta forma ahora 592 00:43:58,150 --> 00:44:03,929 puede ser como por ejemplo un caso no esto que el usuario te diga si lo quiero por otro criterio 593 00:44:03,929 --> 00:44:15,110 pues entonces tengo este modo de aquí y veamos si funciona tec fijaos este era el original esto 594 00:44:15,110 --> 00:44:26,030 es ordenado de forma natural por nombre y este de aquí es ordenado con el nuevo criterio 24 40 595 00:44:26,030 --> 00:44:44,639 45 y como lo sobre escribe para sobre escribir el compare tú necesitaría hacer otra clase que 596 00:44:44,639 --> 00:44:53,130 herede de persona pero luego los objetos que tengo yo son personas no de la subclase tú tú 597 00:44:53,130 --> 00:44:55,530 puedes sobreescribir cuando tienes una subclase 598 00:44:55,530 --> 00:44:57,610 y sobreescribes el método de la superclase. 599 00:44:58,050 --> 00:44:59,250 Entonces, si persona 600 00:44:59,250 --> 00:45:01,429 tiene tu Compertú 601 00:45:01,429 --> 00:45:03,429 y lo quieres sobreescribir, 602 00:45:03,769 --> 00:45:04,590 tienes que crearte 603 00:45:04,590 --> 00:45:07,550 persona ordenada por edad 604 00:45:07,550 --> 00:45:09,610 y aquí sobreescribir 605 00:45:09,610 --> 00:45:11,269 el caso. Pero luego los objetos que 606 00:45:11,269 --> 00:45:13,210 tienes en la lista son objetos personas, ¿no? 607 00:45:13,269 --> 00:45:15,010 Objetos personas ordenadas por edad. 608 00:45:15,789 --> 00:45:17,329 Y entonces cuando tú llamarás el 609 00:45:17,329 --> 00:45:19,309 Compertú, llamarás siempre el de persona. 610 00:45:20,449 --> 00:45:21,289 Entonces no te funciona. 611 00:45:23,380 --> 00:45:23,719 ¿Dudas? 612 00:45:27,800 --> 00:45:44,530 Vale, ahora, la cosa fea de esto, ¿sí?, es que nosotros nos estamos creando un objeto que no sirve de nada. 613 00:45:45,309 --> 00:45:55,960 ¿Cuándo vas a crear estos objetos de aquí? Nunca. Lo vas a crear cuando tienes que hacer este trabajo de aquí. 614 00:45:55,960 --> 00:46:01,559 pero luego este objeto de aquí 615 00:46:01,559 --> 00:46:03,719 no te sirve de nada, es como un objeto comodín 616 00:46:03,719 --> 00:46:05,699 que necesitas pasarle aquí 617 00:46:05,699 --> 00:46:07,760 porque él sabrá que dentro 618 00:46:07,760 --> 00:46:09,300 de aquí está el método compare 619 00:46:09,300 --> 00:46:11,699 que es el método que tiene que usar para comparar 620 00:46:11,699 --> 00:46:13,679 las personas y ordenarlas 621 00:46:13,679 --> 00:46:18,119 entonces vamos a hacer el último paso 622 00:46:18,119 --> 00:46:25,159 al revés 623 00:46:25,159 --> 00:46:31,050 porque ahora que he aprendido que 624 00:46:31,050 --> 00:46:33,050 puedo cambiar el criterio como me da la gana 625 00:46:33,050 --> 00:46:34,909 quiero un metodito que en vez de ordenarlo 626 00:46:34,909 --> 00:46:36,710 de más joven a más viejo 627 00:46:36,710 --> 00:46:38,489 hace de más viejo a más joven 628 00:46:38,489 --> 00:46:40,929 ¿sí? es otro criterio 629 00:46:40,929 --> 00:46:50,900 entonces ahora tengo 630 00:46:50,900 --> 00:46:52,519 este nuevo método de aquí 631 00:46:52,519 --> 00:46:55,300 que lo que hace es utilizar 632 00:46:55,300 --> 00:46:57,199 el coso 633 00:46:57,199 --> 00:46:59,239 ¿vale? entonces por como lo hemos 634 00:46:59,239 --> 00:47:01,360 aprendido nosotros y por como lo podéis usar 635 00:47:01,360 --> 00:47:02,659 vosotros tranquilamente 636 00:47:02,659 --> 00:47:05,300 pues lo que hacéis es me crearía 637 00:47:05,300 --> 00:47:06,639 otro objeto que es 638 00:47:06,639 --> 00:47:08,820 orden por edad invertido 639 00:47:08,820 --> 00:47:11,380 cambiar esto con esto 640 00:47:11,380 --> 00:47:12,760 y ya está 641 00:47:12,760 --> 00:47:14,519 justo 642 00:47:14,519 --> 00:47:17,000 pero vamos a ver una cosilla 643 00:47:17,000 --> 00:47:18,880 que os encontráis por allí 644 00:47:18,880 --> 00:47:19,980 y que a lo mejor 645 00:47:19,980 --> 00:47:23,099 os puede dar molestar 646 00:47:23,099 --> 00:47:25,019 si la veis y no sabéis que es 647 00:47:25,019 --> 00:47:27,539 aquí 648 00:47:27,539 --> 00:47:30,219 que es donde pondría el objeto 649 00:47:30,219 --> 00:47:31,619 nuevo 650 00:47:31,619 --> 00:47:33,300 le digo new 651 00:47:33,300 --> 00:47:36,420 comparator 652 00:47:37,159 --> 00:47:38,420 de persona 653 00:47:38,420 --> 00:47:57,239 persona. Y la sintaxis es un problema. Paréntesis y paréntesis. A ver si se ve todo. No se 654 00:47:57,239 --> 00:48:11,570 ve todo. ¿Lo veis esta cosa maléfica y malvada aquí? Aquí lo que estoy haciendo es crear 655 00:48:11,570 --> 00:48:20,030 un nuevo objeto, pero no estoy creando un objeto de algo que existe, mas estoy definiendo 656 00:48:20,030 --> 00:48:21,869 la clase de este objeto 657 00:48:21,869 --> 00:48:23,250 aquí dentro 658 00:48:23,250 --> 00:48:29,119 esta se llama clase anónima 659 00:48:29,119 --> 00:48:31,500 estoy creando 660 00:48:31,500 --> 00:48:33,840 una nueva clase sin definir esa clase 661 00:48:33,840 --> 00:48:37,639 y le estoy diciendo que es un new comparator 662 00:48:37,639 --> 00:48:38,940 cuidado, que yo os había dicho 663 00:48:38,940 --> 00:48:40,420 no se puede hacer un new de una 664 00:48:40,420 --> 00:48:43,320 clase, de una interfaz 665 00:48:43,320 --> 00:48:45,320 pero cuando lo haces así, sí 666 00:48:45,320 --> 00:48:47,719 porque lo estás definiendo aquí 667 00:48:47,719 --> 00:48:50,860 de hecho él se enfada porque dice 668 00:48:50,860 --> 00:48:52,380 me falta saber 669 00:48:52,380 --> 00:48:57,820 me dice, oye, mira, que le falta el método 670 00:48:57,820 --> 00:49:01,420 porque para que sea un comparator, quiere decir que tiene que implementar 671 00:49:01,420 --> 00:49:05,639 esta clase, que no sé cómo se llama, es una clase anónima, no tiene nombre 672 00:49:05,639 --> 00:49:10,059 pero como tú me dices que es un tipo comparator, tiene que tener el método compare 673 00:49:10,059 --> 00:49:13,000 ¿dónde se lo pongo? 674 00:49:13,000 --> 00:49:17,300 pues en su definición de clase, es decir, entre estos dos 675 00:49:17,300 --> 00:49:19,179 estas dos llaves de aquí 676 00:49:19,179 --> 00:49:22,980 entonces pincho aquí 677 00:49:22,980 --> 00:49:26,480 y veis que me lo añade aquí dentro 678 00:49:26,480 --> 00:49:30,539 o sea que ahora sin tener que crearme una clase extra 679 00:49:30,539 --> 00:49:32,159 y luego crear un objeto de esto 680 00:49:32,159 --> 00:49:35,340 le estoy diciendo, oye mira, tú ordename personas 681 00:49:35,340 --> 00:49:39,340 y el criterio de ordenación te lo voy a definir aquí 682 00:49:39,340 --> 00:49:41,599 usando una clase anónima 683 00:49:41,599 --> 00:49:44,380 que implementa comparator 684 00:49:44,380 --> 00:49:46,800 y que aquí es donde te defino 685 00:49:46,800 --> 00:50:09,429 Pero, ¿cómo se compara? ¿Qué es? Hemos dicho al revés de esto. Esto me evita de crear una clase externa para hacer una cosa como esto que solo me sirve aquí. 686 00:50:10,829 --> 00:50:24,630 Ahora, si yo esto lo uso 100 veces, en momentos distintos, pues cada vez tengo que volver a reescribir esto. Entonces a lo mejor me compensa escribirlo fuera, crearme un objeto solo de esto aquí y usarlo todas las veces que quiero. 687 00:50:24,630 --> 00:50:26,610 Pero si lo uso solo aquí 688 00:50:26,610 --> 00:50:28,550 Pues tengo esta opción de aquí 689 00:50:28,550 --> 00:50:30,429 ¿Por qué os hago ver esto? 690 00:50:31,630 --> 00:50:33,130 Porque esto aparece 691 00:50:33,130 --> 00:50:35,349 Si vosotros buscáis en 692 00:50:35,349 --> 00:50:37,530 Stack Overflow 693 00:50:37,530 --> 00:50:39,289 Si vosotros buscáis en 694 00:50:39,289 --> 00:50:40,909 ChartGPT, como no 695 00:50:40,909 --> 00:50:43,190 Es posible que la solución 696 00:50:43,190 --> 00:50:44,150 Que os da sea esta 697 00:50:44,150 --> 00:50:46,769 Y para que vosotros la entendáis 698 00:50:46,769 --> 00:50:48,030 ¿Quiero que la uséis? 699 00:50:48,369 --> 00:50:50,170 Claro, si sabéis usarla, perfecto 700 00:50:50,170 --> 00:50:52,670 Pero no va a restar ni a sumar puntos 701 00:50:52,670 --> 00:51:00,179 hacerlo así o hacerlo así esto es estándar de como hemos visto de 702 00:51:00,179 --> 00:51:04,199 implementar comparator etcétera etcétera por lo tanto esto lo tenéis que saber 703 00:51:04,199 --> 00:51:11,820 hacer este de aquí si sois programadores más avanzados si queréis aplicar esta 704 00:51:11,820 --> 00:51:16,480 nueva forma de definir las cosas quién soy 705 00:51:16,480 --> 00:51:23,800 yo para para decir que no vale esto cuanto más aumenta la complejidad de lo 706 00:51:23,800 --> 00:51:30,300 que vais a mirando los ejercicios más se empieza a parecer pero por ahora si no lo sabéis usar y 707 00:51:30,300 --> 00:51:36,039 no queréis aprenderlo ningún problema y os lo digo para que si lo veáis si lo veis una cosa 708 00:51:36,039 --> 00:51:47,039 así digáis oye qué es eso y vamos a ver si funciona pues ya está original ordenado por 709 00:51:47,039 --> 00:51:56,460 nombre que es el short sin nada ordenado por de menor a mayor edad utilizando el objeto orden por 710 00:51:56,460 --> 00:52:02,880 edad y este de aquí es el último que hemos hecho, que me lo ordena por edad descendiente 711 00:52:02,880 --> 00:52:30,610 usando la clase anónima. Entonces, ¿para qué sirve la interfaz comparable? Para establecer 712 00:52:30,610 --> 00:52:43,809 un orden estándar con el que se ordenan mis objetos. Muchas clases o muchos métodos pueden 713 00:52:43,809 --> 00:52:45,750 requerer que yo 714 00:52:45,750 --> 00:52:47,550 tenga establecido un orden 715 00:52:47,550 --> 00:52:49,650 de mis objetos para poder ordenarlos 716 00:52:49,650 --> 00:52:51,650 o para poder hacer algo como pillar 717 00:52:51,650 --> 00:52:53,389 el menor. Si tú no me has definido 718 00:52:53,389 --> 00:52:55,710 cómo se comparan dos objetos entre ellos 719 00:52:55,710 --> 00:52:56,809 no te puedo pillar el menor. 720 00:52:58,309 --> 00:52:59,269 ¿Sí? ¿Make sense? 721 00:53:00,130 --> 00:53:01,389 Una clase que 722 00:53:01,389 --> 00:53:03,849 conocéis vosotros que entra en el examen 723 00:53:03,849 --> 00:53:05,210 que necesita 724 00:53:05,210 --> 00:53:05,969 comparable. 725 00:53:07,489 --> 00:53:09,550 Que necesita que los objetos que usa 726 00:53:09,550 --> 00:53:10,889 sean comparable. 727 00:53:13,110 --> 00:53:14,090 Triset, por ejemplo. 728 00:53:15,250 --> 00:53:26,849 TRIMAP, ¿sí? Todo lo que son TRI, como el árbol se construye en base a si este objeto que voy a insertar es mayor o menor, 729 00:53:27,530 --> 00:53:32,090 pues necesitan, los objetos que manejo necesitan implementar COMPARABLE. 730 00:53:33,510 --> 00:53:39,429 Entonces, ¿para qué sirve COMPARABLE? Para definir un orden estándar, un orden natural de mis objetos. 731 00:53:39,429 --> 00:53:48,849 Y pertenecerá al mismo objeto, a la clase que define el objeto, persona, pues implementa su posibilidad de ser ordenado. 732 00:53:49,730 --> 00:53:51,650 ¿Para qué sirve la interfaz comparator? 733 00:54:05,119 --> 00:54:11,539 Para establecer un criterio distinto del natural, de los estándar, para comparar dos objetos. 734 00:54:11,539 --> 00:54:23,579 para establecer un criterio de comparación distinto del natural que ya está en la cosa, ¿vale? 735 00:54:24,559 --> 00:54:27,500 Un ejemplo de utilizo es el sort, ¿vale? 736 00:54:27,599 --> 00:54:31,099 El sort, si yo no le digo nada, me lo ordenará de forma natural. 737 00:54:31,619 --> 00:54:37,820 Si yo le digo, ordénamelo según otro criterio, pasándole el criterio, 738 00:54:37,820 --> 00:54:56,960 Sea porque me he hecho un objeto que implemente compare o comparator, o sea porque le implemento aquí directamente, hago una clase anónima poniéndole aquí el objeto comparator y la implementación del compare, pues me ordena según este otro criterio. 739 00:54:57,920 --> 00:54:58,260 ¿Dudas?