MANEJO DE estructuras de dos dimensiones y persistencia
Nychol Bazurto Gómez

Matrices
Nivel
6
Persistencia
Construcción de un programa
VEREMOS lo siguiente
- Cómo definir, crear y manipular matrices (estructuras contenedoras de 2 dimensiones).
- Patrones de recorrido de matrices.
- Esquema simple de persistencia (archivos).
MATRICES
MATRICES
Contenedoras de dos dimensiones de tamaño fijo cuyos elementos son referenciados utilizando dos índices: índice de la fila e índice de la columna.
| 0,0 | 0,1 | 0,4 | ||
|---|---|---|---|---|
| 1,0 | ||||
| 3,3 | ||||
| 5,2 | ||||
| 6,4 |
DEclaración de una matriz
public class Imagen
{
//--------------------------------------
// Atributos
//--------------------------------------
private int ancho;
private int alto;
private Color[][] bitmap;
}Es conveniente declarar el número de columnas (ancho) y el número de filas (ancho) como atributos. Esto va a facilitar realizar posteriores modificaciones al programa.
private <tipoDato> [ ][ ] >nombreMatriz>;
inicialización de una matriz
// Constructor
//--------------------------------------
public Imagen( )
{
ancho = 400;
alto = 300;
bitmap = new Color[ alto ][ ancho ];
}nombreMatriz = new <tipoDato>[filas][columnas];
Para filas y columnas se pueden usar constantes.
Al inicializar la matriz, se construye una matriz con el número de filas y columnas dadas, pero dentro de cada casilla de la matriz no hay valores asignados, por lo que se debe inicializar cada casilla. Esto se puede hacer una por una, o con un for doble.
- Para inicializar una casilla, se debe indicar su fila y columna y asignarle un valor.
Matrices
bitmap[ 0 ][ 1 ] = new Color( 0, 0, 255 );-
Los recorridos sobre las matrices se hacen con un for doble, el for externo (el de int i) tiene el índice de las filas y el for interno (el de int j) tiene el índice de las columnas.
Esto implica que el recorrido se daría de izquierda a derecha y de arriba abajo.
Acceso a los Elementos de una Matriz
public void imagenAzul( )
{
for( int i = 0; i < alto; i++ )
{
for( int j = 0; j < ancho; j++ )
{
bitmap[ i ][ j ] = new Color( 0, 0, 255 );
}
}
}Acceso a los Elementos de una Matriz
for( int i = 0; i < FILAS; i++ )
{
for( int j = 0; j < COLUMNAS; j++ )
{
//...
}
}Comienza en la fila 0 (int i = 0) y columna 0 (int j = 0), esto es la casilla superior izquierda (resaltada en azul).
Acceso a los Elementos de una Matriz
for( int i = 0; i < FILAS; i++ )
{
for( int j = 0; j < COLUMNAS; j++ )
{
//...
}
}En la siguiente iteración j aumenta en 1 (j++) entonces la casilla actual es 0,1
Acceso a los Elementos de una Matriz
for( int i = 0; i < FILAS; i++ )
{
for( int j = 0; j < COLUMNAS; j++ )
{
//...
}
}En la siguiente iteración j aumenta en 1 (j++) entonces la casilla actual es 0,2
Acceso a los Elementos de una Matriz
for( int i = 0; i < FILAS; i++ )
{
for( int j = 0; j < COLUMNAS; j++ )
{
//...
}
}En la siguiente iteración j aumenta en 1 (j++) entonces la casilla actual es 0,3
Acceso a los Elementos de una Matriz
for( int i = 0; i < FILAS; i++ )
{
for( int j = 0; j < COLUMNAS; j++ )
{
//...
}
}- En la siguiente iteración j aumenta en 1 (j++), pero j no cumple la condición j < FILAS, por lo que el recorrido interno se acaba, por lo tanto i aumenta en i (recorrido externo con i++) y j vuelve a empezar en 0. La casilla actual es 1,0 (con i = 1 y j=0)
Acceso a los Elementos de una Matriz
for( int i = 0; i < FILAS; i++ )
{
for( int j = 0; j < COLUMNAS; j++ )
{
//...
}
}- En la siguiente iteración j aumenta en 1 (j++) entonces la casilla actual es 1,1
Acceso a los Elementos de una Matriz
for( int i = 0; i < FILAS; i++ )
{
for( int j = 0; j < COLUMNAS; j++ )
{
//...
}
}...CONTINUEMOS...
Acceso a los Elementos de una Matriz
for( int i = 0; i < FILAS; i++ )
{
for( int j = 0; j < COLUMNAS; j++ )
{
//...
}
}...CONTINUEMOS...
Cómo comparar los elementos de una matriz
- Si los elementos de una matriz son de tipo simple (enteros, reales, etc.)
–Se comparan con el operador ==.
- Si los elementos NO son de tipo simple, sino que son objetos, en la matriz se guarda una referencia (apuntador) al objeto y NO el objeto mismo. En este caso, hay que compararlos con equals.
- Contar cuántos puntos en la imagen son rojos
- Cambiar el color de todos los puntos en la imagen haciéndolos mas oscuros
- Cambiar cada color de la imagen por su negativo
- Contar cuántos puntos en la imagen tienen una componente roja distinta de cero
Persistencia y Manejo del Estado Inicial
Persistencia es ...
Guardar los datos resultado de un programa en un archivo para hacerlos persistentes cuando la aplicación termine.
En APO1 … introducción a persistencia:
Leer y cargar los datos de un archivo para configurar el estado inicial de los elementos del mundo.


Abrir una imagen.
Leer la información para configurar el estado inicial del mundo.
archivo
Una entidad que contiene información y que es almacenada en la memoria secundaria del computador (disco duro, CD, unidad USB, diskette …).
- Tiene un nombre y una extensión.
-
El nombre tiene una ruta (camino o path en inglés) y el nombre corto propiamente dicho
c:/dev/uniandes/cupi2/empleado/mundo/Empleado.java
archivo
c:/dev/uniandes/cupi2/empleado/mundo/Empleado.java
describe la estructura de directorios dentro de los cuales se encuentra el archivo
- “/”: separador de nombres de archivos. En Windows se suele utilizar como separador el carácter '\' (backslash) mientras que en Unix y Linux se utiliza el carácter '/' (slash)
- Extensión: indica el tipo del archivo (doc para word, xls para excel, txt para texto, java para java, …)
Leer Datos como Propiedades
Para hacer esta carga se utilizará un archivo de propiedades y una clase de Java que se llama Properties.
- Los archivos de propiedades son archivos de texto que tienen una línea de texto por cada propiedad.
- A su vez cada línea tiene el nombre de la propiedad y el valor del texto que está guardando
<nombre>=<valor>

Leer Datos como Propiedades

Leer Datos como Propiedades

- Se recibe un parámetro de tipo File (archivo de propiedades)
- Se crea la variable “datos” de tipo Properties para guardar las propiedades y un flujo de lectura (FileInputStream).
- En la variable datos se carga lo que se leyó del archivo.
- Por último si se llama al método cargarEquipos que recibe como parámetro un objeto de tipo Properties.
- Puede que se presenten problemas en la lectura de archivos o en la carga de las propiedades, por lo que se debe usar try y en el catch se vuelve a lanzar una excepción de tipo Exception.
Leer Datos como Propiedades

- La clase Properties, tiene un método que se llama getProperty (String pNombrePropiedad) y nos permite pedirle el valor de cada propiedad y lo retorna como un String, para los datos que deben ser int, se utiliza el método parseInt de la clase Integer.
CAMINO COMPLETO

1. Solicitar la selección del archivo de propiedades
CAMINO COMPLETO
1. Solicitar la selección del archivo de propiedades
public class InterfazCampeonato extends JFrame
{
public void cargarEquipos( )
{
...
JFileChooser fc = new JFileChooser( "./data" );
fc.setDialogTitle("Abrir archivo de campeonato");
File archivoCampeonato = null;
int resultado = fc.showOpenDialog( this );
if( resultado == JFileChooser.APPROVE_OPTION )
{
archivoCampeonato = fc.getSelectedFile( );
campeonato = new Campeonato( archivoCampeonato );
}
}
...
}Obtuvo un objeto de la clase File que representa el archivo que el usuario quiere cargar en memoria.
CAMINO COMPLETO
2. Inicialización del estado de la aplicación
public class InterfazCampeonato extends JFrame
{
public void cargarEquipos( )
{
...
JFileChooser fc = new JFileChooser( "./data" );
fc.setDialogTitle("Abrir archivo de campeonato");
File archivoCampeonato = null;
int resultado = fc.showOpenDialog( this );
if( resultado == JFileChooser.APPROVE_OPTION )
{
archivoCampeonato = fc.getSelectedFile( );
campeonato = new Campeonato( archivoCampeonato );
}
}
...
}Se crea el objeto campeonato, que recibe el archivo.
CAMINO COMPLETO
2. Inicialización del estado de la aplicación
//---------------------------------------
// Constructor
//---------------------------------------
public Campeonato( File pArchivo ) throws Exception
{
Properties datos = cargarInfoCampeonato( pArchivo );
inicializarEquipos( datos );
inicializarTablaGoles( );
}- El constructor lanza una excepción si encuentra un problema al leer el archivo o si el formato interno del mismo es inválido.
- El primer método carga la información del archivo en un objeto llamado datos.
- El segundo método recibe dicho objeto e inicializa el arreglo de equipos.
- El tercer método aprovecha la información dejada en los atributos, para crear la matriz con la tabla de goles.
CAMINO COMPLETO
2. Inicialización del estado de la aplicación
private Properties cargarInfoCampeonato( File pArchivo ) throws Exception
{
Properties datos = new Properties( );
FileInputStream in = new FileInputStream( pArchivo );
try
{
datos.load( in );
in.close( );
}
catch( Exception e )
{
throw new Exception( "Formato inválido" );
}
return datos;
}CAMINO COMPLETO
2. Inicialización del estado de la aplicación
private void inicializarTablaGoles( )
{
tablaGoles = new int[ maxEquipos ][ maxEquipos ];
for( int i = 0; i < maxEquipos; i++ )
{
for( int j = 0; j < maxEquipos; j++ )
{
if( i != j )
{
tablaGoles[ i ][ j ] = SIN_JUGAR;
}
else
{
tablaGoles[ i ][ j ] = INVALIDO;
}
}
}
}CAMINO COMPLETO
2. Inicialización del estado de la aplicación
private void inicializarEquipos( Properties pDatos )
{
String strNumeroEquipos = pDatos.getProperty( "campeonato.equipos" );
maxEquipos = Integer.parseInt( strNumeroEquipos );
equipos = new Equipo[ maxEquipos ];
for( int i = 0; i < maxEquipos; i++ )
{
String nombreEquipo = datos.getProperty( "campeonato.nombre" + i);
equipos[ i ]= new Equipo( nombreEquipo );
}
}Proceso de Construcción
de un Programa





¿PREGUNTAS?
¿PREGUNTAS?
- J. Villalobos and R. Casallas, Fundamentos de Programación. https://cupi2.virtual.uniandes.edu.co/libro-del-curso-pdf/libro-completo
- Icons made by wanicon from Flaticonis licensed by Creative Commons BY 3.0
Nivel6
By nychi713
Nivel6
- 636