No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Convierte tus certificados en títulos universitarios en USA

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

19 Días
3 Hrs
21 Min
7 Seg
Curso de Java SE Orientado a Objetos

Curso de Java SE Orientado a Objetos

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Recorriendo estructuras de árbol en Java

36/38
Recursos

Las estructuras de árbol pertenecen al grupo de estructuras de datos no lineales, es decir, donde toda la información es almacenada con un orden específico. En estas estructuras tenemos “troncos” principales con diferentes ramificaciones que surgen a partir de ellos. Son muy útiles para trabajar con grandes cantidades de datos organizados de forma jerárquica.

La forma de implementarlos en Java es usando un Map de tipo TreeMap. Recuerda que también podemos guardar Maps dentro de otros Maps. De esta forma podemos definir una lista ordenada de doctores y sus fechas disponibles para agendar citas médicas.

// 1. Doctor#1
// - - - Fecha#1
// - - - Fecha#2
// 2. Doctor#2
// - - - Fecha#1
// - - - Fecha#2
// 3. Doctor#3
// - - - Fecha#1
// - - - Fecha#2
Map<Integer, Map<Integer, Doctor>> doctors = new TreeMap<>();

Aportes 76

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Como muchos compañeros han expresado , todos nos hemos perdido pero animo , sigue viendo el video una y otra y otra vez hasta que lo comprendas.
Por consiguiente Tratare de describir lo mas explicativo posible para ayudarte a acelerar el proceso :
1.- La profesora hace uso de la interfaz Map en especifico la clase Treemap, que en clases anteriores podrás observar toda la documentación que dejaron acerca de esta Interfaz entre otras , para que no tengas que ir hasta allá te dejo un resumen para TreeMap.
2.- Cuando Se utilizan Estructuras de Arbol?
Usar los diagramas de árbol al trabajar con grandes cantidades de datos con una estructura jerárquica. Cuando existe una correlación entre el color y el tamaño, los diagramas de árbol ayudan a identificar patrones que, de otro modo, serían difíciles de ver.
Los diagramas de árbol también son eficaces para facilitar la lectura porque muestran grandes volúmenes de información en una misma pantalla. Quienes los observan pueden profundizar en una categoría específica para hacer más investigaciones.
https://help.highbond.com/helpdocs/highbond/es/Content/visualizations/interpretations/charts/treemap_chart.htm
3.- Por tanto Eligio hacer uso de Map ya que es una estructura mas compleja que un “Collection”, En la que su mayor particularidad es venir enparejado con otro dato, es decir describes la llave y el elemento emparejado a esta.
3.1.- Es algo parecido a como funciona la llaves en las bases de datos , Un ejemplo podría ser la lista de alumnos en la escuela con la cual pasaban asistencia , si recuerdas o si te ha pasado , cuando tocaba la hora de dar examen, habían maestros que te pedían escribir en la parte superior derecha del examen el numero que te correspondía en la lista de asistencia , es decir de 60 alumnos , Carlos alfredo soria era el numero 45 de la lista de asistencia , por tanto con el simple numero de 45 que seria mi Key , describe algo como : El alumno inscrito Carlos Alfredo Soria.
4.- Los map se declara de la siguiente forma :
Map<Integer , String> treemap = new TreeMap <Integer,String>();
4.1.- En la sintaxis diamante lo que se hace es especificar primeramente el Key(Integer) y Despues el Value(String).
4.2.- En la funcionalidad TreeMap : El mapa los ordena de forma natural , es decir si ingresamos enteros , los ordenara de menor a
mayor.
.
.
.

Describiendo en el video :

1.- Por el minuto 02:45 la profesora hace un repaso de la “estructura de datos” la cual se hizo a partir de los diferentes elementos de abstracción :
En dicha estructura tenemos una lista de doctores , en el q cada doctor se crea mediante la clase Doctor , generando dicha lista como la que
describe en el video…
doctor1 , doctor2 , doctor3 , etc. (Recuerda que ella creo tres doctores como ejemplo).
1.1.- Cada uno de estos doctores tiene un ArrayList de citas disponibles (fechas) , a este ArrayList se le dio el nombre de availableAppointments, significa que por cada objeto Doctor se podría generar una lista de fechas , dicha lista en caso de haber fechas y horarios se almacena en el ArrayList ya antes mencionados.

Nos Muestra una estructura de este tipo :

        // [Doctors] 
       //1.- doctors1
            //1.- fecha1
            //2.- fecha2
       //2.- doctors2
       //3.- doctors3

2.- En doctorsAvailableAppointments se almacenara una lista de doctores pero q tengan citas confirmadas (OJO) , es decir , aquellos doctores que se dieron la molestia de ingresar a la App e introducir las fechas y horarios para los que ellos están disponibles.
2.1- En la siguiente linea :
for (int i = 0; i < doctorsAvailableAppointments.size() ; i++){
De la clase UiPatientMenu fue escrita con la idea de tener performance , ya que con el método size() aplicado al ArrayList doctorsAvailableAppointments es posible saber el numero exacto de objetos(doctores) que vamos a utilizar para imprimir en pantalla.
Sin el ArrayList mencionado podría suceder que tengamos 25 doctores y no es correcto tener que recorrer 25 objetos en busqueda de Fechas Disponibles cuando es mucho mas eficiente almacenar en una lista de doctores(Que puede que sean 5 o menos de 25) que Si han confirmado para brindar atención(Al confirmar atención se tiene la seguridad de que existe fechas disponibles dentro del ArrayList availableAppointments de cada doctor en particular) , además de tener información validada , accesible(recordar que el Arraylist doctorsAvailableAppointments es Stactic) y a la mano.
.
.
Por tanto se concluye que si un Doctor esta listado en doctorsAvailableAppointments significa que hay una lista de fechas disponible en availableAppointments para ese doctor en particular.
3.- En la siguiente linea :
ArrayList<Doctor.availableAppointment> availableAppointments = doctorsAvailableAppointments.get(i).getAvailableAppointments();
3.1- Se crea un nuevo ArrayList llamado availableAppointments del tipo de Objeto Doctor.availableAppointment , recordando que es un tipo de objeto de la subclase availableAppointment
…YYYYYYYYYYY Si!!! tiene el mismo nombre que el ArrayList declarado anteriormente en la clase Doctor , pero tiene su motivo , Te lo explico :
La idea del declarar dicha linea es la de recorrer y obtener cada uno de los doctores listados en doctorsAvailableAppointments
que se los obtiene haciendo uso del metodo get() de la clase ArrayList e indicando el índice mediante la variable i que esta siendo iterado por el For-i.
Por tanto al instante de Obtener el Objeto Doctor en especifico mediante la iterancia del For-i también se obtiene acceso al ArrayList availableAppointments pero a el availableAppointments de la clase Doctor, que recordemos es donde esta almacenado la lista de Fechas y Horarios para ese Objeto (doctor) en particular.

3.2.- Siendo el objetivo final asignar el ArrayList de availableAppointments de la clase Doctor al
ArrayList de availableAppointments de la clase UiPatientMenu , ya que es bueno recordar que el availableAppointments de la clase Doctor NO es Static sino Private y se accede a el mismo mediante el método de la clase Doctor , getAvailableAppointments() .
.
.
.
por tanto concluir que la idea fundamental de la presente linea de código es la de extraer un buen pedazo de información desde una clase (En este caso Doctor) para almacenar dicha informacion en la clase de donde esta siendo declarada dicha linea (UiPatientMenu).

Hola, al igual que tu me perdí en este vídeo ¡No te rindas!

Me parecio que este ejemplo fue uno muy malo para introducir al tema de Map, la curva de dificultad se disparó!

No entendi nada jaja

Creo que faltó profundizar en el tema de Collections, se debió hacer un vídeo de eso sea más entendible éste tema.




Creo que fue un error no hacer un video en una clase previa sobre Collections con ejemplos mas simples

Bastante complejo me ha parecido, pero interesante. He tenido que ver cada video unas 3 veces.

Muy confuso la lógica, no se logra tener el objetivo claro. No me gustó esta clase.

Voy copiando el codigo y todo funciona, pero no siento que estoy aprendiendo, deberian dar mas ejersicios y libertad al estudiante.

el nivel se disparo de un video a otro, jejeje toco repetirlo como 10 veces.

sinteticé un poco esta parte de “showBookAppointmentMenu” para que sea mas comprensible:

int k = 0;
for(Doctor doctor: UIDoctorMenu.doctorsAvailableAppointments)
{

	Map<Integer, Doctor>  doctorAppointments = new TreeMap<>();

	int j = 0;
	for(Doctor.AvailableAppointment appointment : doctor.getAvailableAppointments())
	{
		k++;
		System.out.println(k + ". " + appointment.getDate());
		doctorAppointments.put(Integer.valueOf(j++), doctor);
		doctors.put(Integer.valueOf(k), doctorAppointments);
	}

}

Como dicen por ahí…aprender duele !!

Pienso que otra manera efectiva de entender el código que realizó nuestra Profesora Anahí, es descargando el proyecto y correrlo en nuestras maquinas modo ‘Debug’, ver paso a paso lo que hace el código y evitaremos repetir la clase tantas veces.
Saludos!!

Siento que fue muy rápida esta parte, se enfoco mas en la implementacion que en explicar a profundidad la logica detras de un TreeMap

Curioso cuando dice: "usemos esto que lo venimos manejando varias veces", cuando en realidad se ha dedicado solo a programar mas no a fundamentar porque se usa uno u otra cosa. Realmente los ultimos capitulos bastante pesimos.

Las ultimas clases se han puesto rapidas XD

Una clase bastante compleja a mi parecer. se alteraron algunas cosas que ya se había hecho previamente para que pudiera funcionar la lógica que se estaba aplicando de los maps y queda algo en el aire o no quedan muy claras estas modificaciones…
Recomendaría que en el curso básico de javaSE, se profundice mas sobre este tema, ya que de por si manejar estructura de arboles puede ser algo complejo y confuso, mas para los que estamos empezando y así aprovecha y hacer una explicación mas detallada del uso o aplicación del MAP que es una herramienta bastante potente…

Otro video que hay que ver a 0.85x.

No es por nada pero hoy si me quede viendo luces

Tanta cosa para saber que un Map almacena datos como un JSON, por llave valor … muy enrredado este video la verdad

Leí muchas quejas en este video, pero es que les hace falta conocer más sobre Collections y estructuras de datos en Java, un tema que en lo particular se me hace fascinante. Quizá no sería tan mala idea, estimado Platzi, que crearan un curso específico sobre esto.

En un momento regreso señores, me toca que ir a investigar todo hacer da map si no, no puedo entender la clase …

hay los alcanzo al rato.

Como me llamo?

Todo bien!!, de no ser porque todo está mal, super perdido, inentendible, incomprensible, inescrutable…

Compañeros, por hoy me rindo, mañana vere nuevamente desde el video 32. A descansar para volver a luchar. Arriba el animo a todos!

Estuvo muy bien el curso. Siento que en los últimos videos hubo algo de premura, había contenidos muy interesantes y complejos que tal vez sería bueno tratarlos con más calma (a mi modo de ver). De igual manera Anahí es una excelente profe y el curso ha sido muy enriquecedor.

Pareciera que se quedaron sin tiempo y pusieron todo el contenido restante deprisa sin tomarse el tiempo de explicarlo debidamente.

La verdad fue muy rapido y el curso iba como si en algun video anterior ya fueran explicado esta parte. Pro lo menos yo no he visto algun video donde se detengan a explicar con calma esto como lo han hecho con otras cosas. Ahi vamos.

Comparto mis notas por Si alguien le puede dar claridad ¿Qué hace este código? Este código forma parte del menú para que los pacientes reserven citas. Su objetivo principal es mostrar una lista de fechas disponibles para citas y permitir que el paciente seleccione una. La complejidad viene de la forma en que se organizan los datos para lograr esto: 1\. Estructura de Datos Anidada (Map dentro de Map): ○ Se utiliza un TreeMap (un tipo especial de diccionario que mantiene las claves ordenadas) para almacenar la información de las citas disponibles. ○ La estructura es la siguiente: § Clave (Integer): Un número que representa la opción de cita en la lista que se muestra al paciente. § Valor (Map\<Integer, Doctor>): Otro diccionario donde: □ Clave (Integer): Un índice (0, 1, 2...) que identifica la cita específica dentro de la lista de citas disponibles de un doctor. □ Valor (Doctor): El objeto Doctor asociado a esa cita. 2\. Llenado del Diccionario: ○ Se recorren los doctores disponibles (UIDoctorMenu.doctorsAvailableAppointments). ○ Para cada doctor, se recorren sus citas disponibles (availableAppointments). ○ Se muestra cada fecha al paciente (System.out.println(k + ". " + availableAppointments.get(j).getDate());) ○ Se añade un par clave-valor al diccionario doctorAppointments: el índice de la cita y el doctor correspondiente. ○ Se añade otro par clave-valor al diccionario doctors: el número de opción de cita y el diccionario doctorAppointments del doctor. 3\. Selección del Paciente: ○ Se espera a que el paciente introduzca el número de la cita que desea. Conceptos Clave : • Diccionarios (Map): ○ Almacenan pares de clave-valor. ○ Las claves son únicas. ○ Sirven para buscar valores de forma eficiente a partir de sus claves. ○ TreeMap mantiene las claves ordenadas (útil para mostrar opciones en orden). • Diccionarios Anidados: ○ Puedes almacenar un diccionario dentro de otro. ○ Esto permite modelar relaciones más complejas entre datos. • Bucles Anidados: ○ El código utiliza dos bucles for anidados para recorrer tanto los doctores como las citas de cada doctor. Puntos Clave: • Organización de Datos: Los diccionarios anidados pueden ser potentes, pero también pueden hacer que el código sea más complejo de entender. Analiza cómo se relacionan los datos en este ejemplo. • Cuándo Usar Diccionarios: Son ideales cuando necesitas asociar valores a claves únicas (como en este caso, asociar fechas de citas a doctores). • Claves y Valores: Asegúrate de entender qué tipos de datos estás utilizando como claves y como valores.
Excelente vídeo.

PÉSIMO… muy este capitulo y en general este curso.

Arrepentido de llevar este curso. pero ya estoy en caminado en el aprendizaje de JAVA, así que seguiré avanzando.

No entendí nada

Una clase que explica los collections. Me ayudo a entender un poco esta clase
https://platzi.com/clases/1222-java-basico-2018/10029-interfaz-list-arraylist-y-vector/

falto tocar el tema de collections de una mejor manera , no se entiende,

una clase poco clara

Nooo. !
Perdido por completo.

Esta clase si estuvo algo revuelta

Siento que se debió haber hecho una introducción a Map mediante ejercicios más simples que nos dieran más facilidad a la hora de trabajar con Map.

🌳 Un árbol es usada con frecuencia en la Inteligencia artificial.

Super!!

Muchas gracias por la clase instructora Anahí, en esta se puede observar la aplicación de los conocimientos previos y el ejemplo que acompaña al post sobre Collections, enlace: https://platzi.com/clases/1629-java-oop/21597-collectio-1/

Esta clase estuvo muy loca.
Dberían actualizar los cursos ya que siempre habrán personas tomandolos más recientemente, y en casos como este video rehacerlos y dividirlos adecuadamente ya que se perdió toda la pedagogia.
tarde 30 minutos en un } mal puesto :C

Hola, tuve que pausarlo en el minuto 10:28 para entender todo lo que teniamos hasta ese punto, la mejor manera fue explicarle a mi cubo rubic (tome mi rubic y le fui diciendo que hacia cada parte) Aqui mi codigo hasta ese punto, con comentarios explicativos de que hacen las lineas que podrian traer confucion, espero, que les sirva:

//primer elemento: numeracion lsita fecha
//el segundo integer, sera indice de la fecha que seleccione el paciente
//[doctors] -> lista de doctores
//1.-doctor1
//      *-1.fecha
//      * 2. fecha
//2.doctor2
//Basicamente la siguiete colleccion de Arbol, se compone de una lista de doctores identificados por id, por eso, el outer map tiene un Integer en el key
//Luego el value del outer map tendra otro map, ese segundo map va a tener un identificador, que seran los indices para las fechas... y esa fecha
//value de tipo doctor (que seria nuestro docotr)
/*El siguiente Map, llamado doctors:
 * Se crea un Map llamado doctors, que es una estructura de datos que almacena información sobre los
 *  médicos y sus citas disponibles. El Map principal utiliza enteros como claves (identificadores de médicos)
 *  y contiene otro Map anidado. El Map anidado utiliza enteros como claves (índices de fechas) y 
 * almacena objetos de tipo Doctor como valores.
 */
            Map<Integer, Map<Integer, Doctor>> doctors = new TreeMap<>();
            /*Se inicializa una variable k en 0, que se usará para llevar un 
            seguimiento de la posición en la que se insertarán los datos en el Map principal. */
            int k = 0; 
            /*Se inicia un bucle for que recorre la lista de médicos disponibles en UIDoctorMenu.doctorsAvailableAppointments. */
            for(int i = 0; i < UIDoctorMenu.doctorsAvailableAppointments.size(); i++){

                /*Para cada médico, se obtiene una lista de sus citas disponibles utilizando getAvailableAppointments(). Estamos recorriendo por doctor, cuando 
                 * estemos por ejemplo con el docotr "Juan" que se encuentra en el recorrido que hacemos con la "i", obtendremos sus citas dsiponibles
                 */
                ArrayList<Doctor.AvailableAppointment> availableAppointments = UIDoctorMenu.doctorsAvailableAppointments.get(i).getAvailableAppointments();


                /*Se crea un nuevo Map llamado doctorAppointments, que se utilizará para almacenar las citas disponibles para el médico actual. */
                Map<Integer, Doctor> doctorAppointments = new TreeMap<>();
                /*Se inicia otro bucle for que recorre las citas disponibles para el médico actual. */
                for(int j = 0; j < availableAppointments.size();j++){ 

                    /*Dentro de este bucle, se incrementa la variable k en 1 para llevar un seguimiento de la posición en el Map principal. */
                    k++; // -> recuerda que k, sera el indice para nuestro map llamado "doctors"
                    System.out.println(k + ". " + availableAppointments.get(j).getDate());
                    doctorAppointments.put(Integer.valueOf(j), UIDoctorMenu.doctorsAvailableAppointments.get(i));
                    /*inalmente, se agrega una entrada al doctors principal, donde la clave es el índice k y el valor es el doctorAppointments que contiene las citas disponibles para ese médico. */
                    doctors.put((Integer.valueOf(k)),doctorAppointments); // -> nuestro map llamado doctors, recibe un integer, y luego recibe un map
                }
            }
        }while(response!=0);
    }
}

Las estructuras más complejas las utilizó sin introducción, explicado sobre la marcha. Y para colmo te presenta un Map anidado sin antes haber visto un Map normal.

Todos nos perdimos al final del curso , lo que nos queda es repasar y dejar feedback para el curso

Les recomiendo si se les hace muy difícil primero ver el map que se usa en JavaScript, así tendrán una noción más simple de su uso.

Yo ya se programar pero hasta para mi fue un poquito complicado el manejo del Map. Aunque ya le entendi

Muy bueno , pero me gustaria que esté diagramado .

La clase Map es parte de las estructuras de datos que maneja Java.

Java maneja dos tipos de estructuras de datos

  1. Collections -> aqui estan los Set, List, Queue
  2. Maps

https://www.arquitecturajava.com/java-collections-framework-y-su-estructura/

Estuvo potente esta clase 😅, pensar en los treemap como Dictionarys de python me ayudo bastante a comprender la lógica que uso en esta parte.

Por si no le entendieron:

System.out.println("::Book an appointment");
            System.out.println("::Select date:");
            Map<Integer, Map<Integer,Doctor>> doctorsGREAT = new TreeMap<>();
            int k = 0; //Esta variable sera el indice de toda la estructura de arbol
            if (UIDoctorMenu.doctors.isEmpty()){//Si no hay ningun doctor loggeado(y con appointments) entonces se rechaza la peticion
                System.out.println("There's not doctors with available appointments!");
            } else {//Se recorre todos los doctores que hay loggeados y con appointments
                for (int i = 0; i < UIDoctorMenu.doctors.size(); i++) {

                    Map <Integer,Doctor> doctorsInsideDoctors = new HashMap<>(); //Se crea le arreglo treemap que se guadara dentro del treemap anteriormente declarado
                    for (int j = 0; j < UIDoctorMenu.doctors.size(); j++) { //Se crea otro fori debido a que ahora iteraremos UIDoctorMenu.doctors dentro de doctorsInsideDoctors, los meteremos para despues meterlos en el primer treemap, como muñecas rusas
                        doctorsInsideDoctors.put(j,UIDoctorMenu.doctors.get(i)); //Se obtiene cada doctor i dentro de una key j
                        doctorsGREAT.put(k,doctorsInsideDoctors); //todo este map se mete dentro de doctorsGREAT pero con una key K que perdura fuera de estos for

                    }
                }
                int responseDateSel =Integer.parseInt(scanner.nextLine());
            }

Hay una asignacion redudante que jamas utiliza Anahi y de hecho se vuelve medio raro, tambien su otro error es que a las variables las nombre como doctors appointment cuando en realidad solo esta guardando doctores ahi, pero ps ahi esta pa mas facil

Excelente conocimiento compartido

Tuve un problema con el Tree, pero ya pude arreglarlo de una manera efectiva

ejale 😃

Muy claro el ejemplo, Se asume que para un curso de POO, se deben tener conceptos de algoritmia y del Paradigma imperativo.

de verdad hay que remirar unas 3 veces al menos para entender, no que sea difícil sino que esta todo junto y como que se va volviendo todo complejo y entrevera

Veo muchas quejas por acá. En código legacy es muy común que se mire este nivel de complejidad, incluso con peor estructuración.

Anahí dice KK (caca)

Cual es la ventaja de manejar Map vs extraer los parametros o datos en general de una BD?

Consejo del día: para esta las 3 clases anteriores sería recomendable que veas algunos fundamentos de base datos, ya que estos ejemplos estan muy orientados a esos temás más en especifico a lo que se conoce como llaves primarias (PK), llaves foráneas (FK) y **cardinalidad **(esto solo es necesario si quisieras aprender más de UML)

Holap. A ver… no soy experto pero creo que puedo explicar esto. La colección Map es una clase y tiene algunas subclases como Hashmap o Treemap. Map funciona con dos valores (<Key>,<Value>)que se tienen que especificar cuando se añada un nuevo elemento con su método put.La diferencia entre estas dos es que Treemap te ordena todos los elementos de acuerdo a su key.

Me parece que hubo confusión porque en realidad la estructura de los maps es asi: k j i 1.- doctorAppointments0 (0,Doctor0) 2.- doctorAppointments0 (1,Doctor0) 3.- doctorAppointments0 (2,Doctor0) 4.- doctorAppointments1 (0,Doctor1) 5.- doctorAppointments1 (1,Doctor1) 6.- doctorAppointments1 (2,Doctor1) Donde el map interno tiene una sola línea entre paréntesis

La complejidad de esta clase (nunca antes mejor dicho), fue creada para evitar las críticas del tipo: “Los cursos de Platzi son básicos”. Estoy completamente seguro de eso.

Pensé que era el único como mínimo repetía 3 veces cada video , es un salto de dificultad muy considerable . Concuerdo con todos que falta profundizar más los temas.

Hola buenas días, si llevaron javascript Map<K,V> es lo mismo la función map = array.map( item => item) solo es mapear el array y poderle dar un formato.

La verdad no entendi nada de nada solo estuve copiado haber si se me pegaba algo pero no fue asi

El curso es muy bueno, no se preocupen si se pierden en esto, en la universidad las estructuras de datos complejas como árboles se ven después de hasta 3 semestres. No se rindan que lograran crear sus propias estructuras de datos personalizadas si es necesario.

esta rudo pero a vamos a ver como logramos nivelarnos

wow

Bueno, pues nada, a investigar más sobre Colletions y estructuras de árbol de Java, porque como ya dijeron muchos en los comentarios, con la explicación tan pobre que dio Anahí esta Clase no hay forma de comprender bien este tema tan denso

solo hay que ver el video despacio para una mejor comprención de lo explicado

Yo solo vi que puso MAP y luego un montón de letras jajaja.