Ayudanos contestando la siguiente encuesta acerca de Videojuegos!
Ir a la encuesta
>

Estructuras de Datos

Objetivo

Aprender a utilizar estructuras de datos para representar información.

Producto a Entregar

Un archivo comprimido con el programa generado en la actividad.

Forma de Trabajo

Equipos

Tiempo estimado

1 hora

Forma de Entrega

Por Blackboard

Recomendaciones

  • Sigue las instrucciones de la actividad y ejercita la lectura crítica.
  • Seleccionar la estructura de datos correcta para el problema correcto nos facilita los problemas.
  • Las estructuras de datos nos permiten representar grandes cantidades de información muy compleja

 

Instrucciones

En este laboratorio vamos a utlizar estructuras de datos para guardar varios objetos en un mismo archivo. Este enfoque no es muy eficiente cuando queremos leer un solo objeto, sin embargo tiene dos ventajas muy importantes, la primera es que es muy fácil de implementar y la segunda es que cuando tenemos que leer todos los datos de cualquier manera nos proporciona un buen desempeño.

Paso 1:

Además de entregar el archivo con tu laboratorio debes entregar un archivo con las respuestas a las preguntas que aparecen en negritas.

Descarga el esqueleto de la aplicación. Abre el proyecto en NetBeans, compílalo y córrelo para verificar que todo funcione correctametne. Deberá aparecer una pantalla similar a la siguiente:

Como puedes ver vamos a utilizar la misma clase Person que hemos utilizado a lo largo de las sesiones de archivos, sólo que esta vez vamos a crear una lista de objetos utilizando estructuras de datos.

Paso 2:

Para poder continuar con las estructuras de datos es preciso conocer las tres estructuras de datos más sencillas y su implementación en Java:

Arreglos: Los arreglos en Java nos permiten representar una estructura estática de información.

Listas Ligadas: Nos permiten representar listas dinámicas de información. En Java utilizamos la clase LinkedList para representarlas. Ahora es preciso pensar un poco en los detalles de implementación de la lista para poder entender una peculiaridad que es preciso tener en cuenta. Imaginemos que queremos crear una lista ligada, como vimos en la presentación tendríamos que implementar una clase similar a la siguiente:

El diagrama anterior dice que tenemos una clase Node, que tiene dos atributos, el primer atributo es otro objeto de la clase Node (que representa el siguiente nodo en la lista, como lo vimos en la presentación), el segundo atributo es el valor que tiene guardado este nodo en particular (si no tuvieramos ningún valor guardado tendríamos una lista muy bonita que no nos sirve para nada porque no tiene datos).

Ahora surge un problema muy importante ¿qué tipo de dato guardamos en la lista ligada? Supongamos que seleccionamos que value sea de tipo int, esto significaría que si quisiera guardar números reales entonces no podría utilizar la lista ligada. Ok, resolvemos el problema fácil, que value mejor sea double, ¿pero qué tal si quisiera guardar los nombres de todos mis empleados? Está bien, vamos a crear la lista ligada de String y si alguien quiere guardar cualquier otra cosa que lo convierta a String. ¿Y si quiero guardar a todos mis empleados voy a estar haciendo miles de String? Bueno, como sabemos que String es subclase de Object (al igual que todas las demás clases de Java) entonces podemos hacer que las listas ligadas guarden Object.

El único problema es que los nodos de las listas ligadas sólo pueden guardar objetos, por lo que no podemos guardar datos primitivos (como int, long, double, boolean). Parece que ya no podemos hacer nada para remediar este último problema, pero qué tal si decidieramos que todo lo que guardamos en las listas sea un objeto y hacemos una clase Integer que lo único que guarda es un int. ¡Problema resuelto!

Ahora que entendemos este pequeño detalle de implementación podemos ver la manera en que creamos las listas ligadas:

Como puedes observar, para crear una lista ligada es preciso que le digas el tipo que es utilizando los símbolos de < y > para poner el nombre de la clase. Es muy importante que recuerdes que entre símbolos < y > siempre debe ir un nombre de clase y que todos los objetos que estén guardados en la lista siempre van a ser de esa clase. De esta manera si quisiera crear una lista que guardara datos long:

Como puedes ver lo único que necesitamos hacer es poner el nombre de la clase correspondiente al tipo de dato que queremos usar (Double para double, Integer para int, Boolean para boolean) y de esta manera podemos utilizar la lista ligada como si contuviera elementos del tipo de dato primitivo.

Como podemos obtener cualquier elemento utilizando el método get() que recibe el índice de la posición que queremos y nos devuelve el valor guardado en esa posición y además existe el método size() que nos devuelve el número de elementos de la lista (recuerda que todos los índices empiezan en cero) podemos recorrer una lista de la misma manera que lo hacemos con un arreglo:

  • ¿Qué imprime el código anterior?

Arreglos dinámicos (También llamados vectores): Los arreglos dinámicos nos permiten crear un arreglo que pueda crecer y se comportan de manera muy similar a las listas ligadas en Java. La clase que podemos utilizar para crear arreglos dinámicos es ArrayList y al igual que la lista ligada debe tener un nombre de clase asociado de la siguiente manera:

Recuerda que puedes utilizar el nombre de cualquier clase para que tu ArrayList o LinkedList guarden datos de esa clase en particular.

Paso 3:

Para este problema en particular, donde vamos a estar guardando la lista en un archivo constantemente, el ArrayList tiene un mejor desempeño que la LinkedList (porque tenemos que leer muchos datos para guardarla). Sin embargo, como el laboratorio no utiliza una gran cantidad de datos podemos utilizar cualquier estructura indistintamente y los métodos son muy similares (en la mayoría de los casos, iguales).

Primero que nada ve a la parte de declaración de variables en el código y crea un modelo de lista (con el que vamos a mostrar a las personas en la lista) y un ArrayList y después inícialos como se ve en la foto (fíjate que tienen que ir antes de initComponents()) :

Una vez que hemos hecho esto debemos ligar la lista con el modelo, por lo que vamos a ir a la parte de diseño.

Una vez que hayas esto compila tu programa y córrelo para verificar que no haya ningún error. Debe aparecerte una lista vacía (porque todavía no hemos agregado gente).

Paso 4:

Ahora vamos a leer los datos de la persona a un objeto de tipo Person y vamos a guardarlo en la lista de personas y agregarlo al modelo:

Una vez que hemos hecho esto debemos crear un ObjectOutputStream para escribir la lista de personas al archivo de la siguiente manera:

Corre tu proyecto y verifica que esté poniendo a las personas en la lista y que esté guardando los datos en el archivo (el archivo debe encontrarse en la carpeta principal de tu proyecto, donde están las carpetas de build, dist, src, etc.).

  • ¿Qué datos tiene el archivo?
  • ¿Reconoces algún nombre?

Paso 5:

Ahora que ya estamos guardando los datos podemos leer los datos al principio del programa. Esto lo conseguimos mediante el siguiente código:

  • ¿Qué sucedería si el archivo no existe?
  • ¿Esa solución es conveniente para un usuario final?

Comprime tu carpeta de trabajo y mándala por Blackboard junto con el archivo de texto en el que respondiste las preguntas.

Ayudanos a mejorar este laboratorio:

¿Cuál es tu opinión del laboratorio?

(1 - buena; 5 - mala).

1        2        3        4        5
¿Cómo se puede mejorar?
¿Encontraste un error? ¿Cuál?

 

Ayudanos contestando la siguiente encuesta acerca de Videojuegos!
Ir a la encuesta