Diseño y Programación Orientada a Objetos Conferencia # 4: TDA Matriz de enteros Facultad Ing. Informática ISPJAE
Contenido Conceptos generales Trabajo con arreglos de múltiples dimensiones en Java TDA Matriz de enteros
Bibliografía Bruce Eckel Thinking in Java. Tercera Edición. 2002. Zukowski John. “Programación Java 2. J2SE 1.4”. Volumen 1. Cap. 6. Pág.145..153. H.M.Dietel:”Como programar en C/C++”. Capítulo 17, epígrafe 17.8 Bjarne Stroustrup “The C++ Programming Language”. Ayuda en línea del Eclipse 3.2
¿Cuál estructura de datos usar para almacenar:? Notas de n estudiantes en 1 asignatura Notas de n estudiantes en m asignaturas 5 5 3 4 … 0 1 2 3 … n 5 5 3 4 … 0 1 2 3 … n 3 5 2 3 … . . . . … 4 4 4 4 … 1 … m R/ Arreglo lineal R/ Arreglo matricial
Nota del estudiante i en la asignatura j Arreglo Matricial Nota del estudiante i en la asignatura j 5 5 .. 4 … 0 1 … i … n 3 5 .. 3 … . . .. . … 4 5 .. 4 … 1 … j m 4 4 .. 4 … Notas n*m notas Asignaturas Estudiantes
Arreglo matricial en C++ 0 1 2 1 2 3 4 x int x[5][3]; stack x[1][2]= 6 6 [fila][columna] x zona contigua 5*3 => 15*4bytes
Arreglo multidimensional en Java Un arreglo de arreglos. Un arreglo de referencias a otros arreglos. Cada nueva dimensión se comporta como una colección de otros arreglos internos.
Arreglo multidimensional en Java x Físico X Lógico
Arreglo multidimensional en Java x X Lógico Físico
Arreglo multidimensional en Java x x Lógico Físico
Arreglo multidimensional en Java Declaración Sintaxis Ejemplos: <tipo>[][] <identif.>; int[][] m; <tipo>[] <identif.> []; int [] m[]; <tipo> <identif.> [][]; int m[][];
Arreglo multidimensional en Java stack heap m int[][] m; m= new int[3][2]; stack heap m m[0] m[2] m[1]
Arreglo multidimensional en Java stack heap m int[][] m; m= new int[3][]; m[0]= new int[2] m[2]= new int[3] stack heap m null m[0] m[2] m[1] null null
Arreglo multidimensional en Java stack heap m null m[0] m[2] m[1] m.length 3 m[0].length 2 m[2].length 3
Arreglo multidimensional en Java stack heap m null m[0] m[2] m[1] 3 1 m[0][0]= 3 m[2][1]= 1
¿Fila? ¿Columna? m null stack heap m null stack heap 3 m[0] m[1] 1 1 3 stack heap m null 1 3
Inicialización int[][] m2 = { {1, 2},{4, 5, 6} }; m null stack heap
Arreglo multidimensional de objetos Rectangle[][] mR; mR= new Rectangle[3][] ; for(int i= 0; i < mR.length; i++) { mR[i]= new Rectangle[2]; for (int j= 0; j < mR[i].length; j++) mR[i][j]= new Rectangle() ; }; ¿Cómo queda la memoria?
TDA: Matriz de enteros
Campos Un arreglo de dos dimensiones Orden de la matriz: Cantidad de filas: cantidad de arreglos (tamaño de la colección de referencias) Cantidad de columnas: cantidad de elementos de cada arreglo (tamaño de las otras colecciones)
Métodos Para la construcción Para manipulación de los datos: lectura/escritura Álgebra interna (sin colaborar con otros objetos) Álgebra externa (en colaboración con otros objetos de la propia clase)
Consideraciones Arreglo de referencias: 1ra columna, cantidad elementos = cantidad filas Todos los arreglos igual capacidad: siempre = cantidad de columnas. Solo se puede añadir/eliminar filas/columnas, pero no elementos aislados. Se utiliza una clase auxiliar para manipular posiciones: RowCol
public class RowCol { private int row, int col; public RowCol(int row, int col) { this.row = row; this.col = col; } public int getRow() {return row;} public void setRow(int row) { if (row >= 0) this.row = row; } public int getCol() {return col;} public void setCol(int col) { if (col >= 0) this.col = col;} }
public class IntMatrix { public static final int DEFAULT_ROW_CAPACITY= 5; DEFAULT_COL_CAPACITY= 5; private int[][] data; private int colCount; private int rowCount;
public IntMatrix(int rowCapacity, int colCapacity ) { if (rowCapacity <= 0 || colCapacity <= 0) data=new int[DEFAULT_ROW_CAPACITY] [DEFAULT_COL_CAPACITY]; else data= new int[rowCapacity] [colCapacity]; } public IntMatrix(){…} public IntMatrix(int[][] source ){…}
public IntMatrix(int[][] source, int rowCount, int colCount) {…} public IntMatrix(IntMatrix source){…} public void set(int row,int col,int item) { if(row < rowCount && col < colCount) data[row][col] = item; } public int get(int row, int col) { return data[row][col];
private void ensureColCapacity(int minCap) { int[][] newData; if(minCap > 0) newData= new int[data.length][colCount + minCap)]; else newData= new int[data.length][colCount + DEFAULT_COL_CAPACITY)]; for(int i= 0 ; i < rowCount ; i++) System.arraycopy(data[i], 0, newData[i], 0, colCount); data = newData; }
public int sum(int row1, int col1, int row2, int col2) { for(int i= row1; i <= row2; i++) for(int j = col1; j <= col2; j++) sum+= data[i][j]; return sum; }
public int sum() { return sum(0, 0, rowCount-1, colCount-1); } public IntMatrix sum(IntMatrix matrix) { // estudio independiente
public IntArray deleteCol(int col) { IntArray deletedCol= new IntArray(getRowCount()); for(int i= 0; i < rowCount; i++) deletedCol.add(data[i][col]); for(int j= col + 1; j < colCount; j++) data[i][j-1]=data[i][j]; clear(0,colCount-1,rowCount-1,colCount-1); colCount--; return deletedCol; }
public RowCol indexBiggerValue( int row1, int col1, int row2, int col2) { int bigger= data[row1][col1]; RowCol rowCol= new RowCol(row1,col1); for (int i = row1; i <= row2; i++) for (int j = col1; j <= col2; j++) if (data[i][j] > bigger) { bigger = data[i][j]; rowCol.setRow(i); rowCol.setCol(j); } return rowCol; }
IntMatrix como instancia miembro Caso de estudio: Ventas de un medicamento
Estudio de un medicamento. Se conoce: unidades vendidas en cada farmacia de una provincia durante cada mes del año. promedio histórico de ventas en cada trimestre del año. Requisitos funcionales: Conocer dado un mes cuántas unidades se vendieron en la provincia. Conocer las farmacias donde se vendió la mayor cantidad de unidades. Conocer los trimestres en que se vendió por encima del promedio histórico.
Venta de Farmacia 1 en Diciembre … Enero Diciembre Farm 1 200 … 100 550 320 70 286 854 324 … Farm n Venta de Farmacia 1 en Diciembre Histórico trimestral 1000 1500 3000 2550
Solución public class SalesMedicin { FloatArray historical; IntMatrix sales;
Solución sales.addRowZero(countPharm); sales.addColZero(12); public SalesMedicin(int countPharm) { this.historical = new FloatArray(4); this.sales= new IntMatrix(countPharm,12); sales.addRowZero(countPharm); sales.addColZero(12); }
Requisitos funcionales Conocer dado un mes cuántas unidades se vendieron en la provincia. public int salesMonth(int month){ return sales.sum(0, month-1, sales.getRowCount()-1, month-1); }
Requisitos funcionales b) Conocer las farmacias donde se vendió la mayor cantidad de unidades.
public IntArray pharmBiggerSales() { IntArray pharSales= sales.sumForRow(0,0, sales.getRowCount()-1, sales.getColCount()-1); IntArray pharBigg= new IntArray(); int index= pharSales.indexBiggerValue();
int bigg= pharSales.get(index); for(int i= 0; i< pharSales.getCount(); i++) if (pharSales.get(i) == bigg) pharBigg.add(i); return pharBigg; }
Requisitos funcionales c) Conocer los trimestres en que se vendió por encima del promedio histórico.
public IntArray trimesterMoreSales() { IntArray trimester= new IntArray(); int sum= 0; float average; for(int month= 0; month < 12; month++) { for(int phar= 0; phar < sales.getRowCount(); phar++) sum += sales.get(phar, month); if((month+1)%3 == 0) { if(sum > historical.average()) trimester.add((month+1)/3); sum= 0; } } return trimester; }
Conclusiones Importancia de implementar TDAs
Estudio Independiente Completar implementación del TDA Matriz de enteros. Comprobar con las implementaciones del doc. Completar implementación del caso de estudio: Ventas de un medicamento
Estudio Independiente Obtener la combinación lineal de m vectores de Rn con los escalares λ1,…, λm. . Proponer diseño para el caso de estudio: Departamento de personal.