Diseño y Programación Orientada a Objetos Conferencia # 3: TDA Colección Lineal de Enteros Facultad Ing. Informática ISPJAE
Contenido Arreglos en Java Arreglos como objetos Modificador de durabilidad final Tipo de dato abstracto: Colección Lineal de Enteros Clase IntArray como instancia miembro
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
Arreglos Concepto C++: int a[10]; a 0 1 2 3 … 9 tamaño físico 4 4byte (int) Concepto C++: int a[10]; a 0 1 2 3 … 9 tamaño físico 1 5 8 2 … 4 tamaño lógico
Arreglos Declaración en Java Sintaxis Ejemplos: <tipo>[] <identificador>; int[] x; <tipo> []<identificador>; int []x; <tipo> <identificador>[]; int x[]; int[] x, y[]; int []x, y[]; ¿y?
Arreglos Distribución en memoria en C++ int x[10]; x stack int* x= new int[10]; stack x stack heap x
Arreglos Distribución de memoria en Java int[] x; stack heap x= new int[10]; stack heap x stack heap x 0 0 0 0 0 0 0 0 0 0
Arreglos Ejemplos: C++: Rectangle arr[10]; Java: Rectangle[] arr; Arreglos de objetos C++: <tipo> <ident>[constante]; Java: <tipo>[] <identificador>; Ejemplos: C++: Rectangle arr[10]; Java: Rectangle[] arr; Clase
Arreglos de objetos: C++ Rectangle x[10]; Rectangle* x= new Rectangle[10]; Rectangle** x= new Rectangle*[10]; stack x 0 1 2 … stack x heap x[0]= new Rectangle(); stack x heap
Arreglos de objetos: Java Rectangle[] x; stack x heap x= new Rectangle[5]; stack x null null null null null heap x[0]= new Rectangle(); stack x null null null null heap x.length 5
Inicialización en Java x.length 5 int[] x = {0, 1, 2, 3, 4}; int[] x = new int[] {0, 1, 2, 3, 4}; Rectangle[] x = {new Rectangle(), new Rectangle(), new Rectangle()}; x.length 3
Arreglos como parámetros en Java Se transfiere la referencia Por valor, solo parámetros de algún tipo primitivo (int, float, boolean, char) Arreglos anónimos obj.metodo(new int[]{9,5,8}); Se implementa chequeo de rango para los índices. ArrayIndexOutOfBoundsException
Comprobación Describa el estado de la memoria después de cada una de las sentencias siguientes : int[] x, y; x= new int[] {0, 1, 2, 3, 4}; y= x;
Modificador de durabilidad final Se utiliza para declarar variables, y parámetros constantes. También se pueden declarar métodos final. Se estudiará más adelante.
Uso de final. Ejemplos //declara e inicializa private final int MAX = 100; //declara private final int MAX; …if (a > b) MAX = 100; //inicializa con 100 else MAX = 200; //inicializa con 200
Uso de final. Ejemplos public class Circle { private final Point point; //refer. const. … public void setX(int x) { point.setX(x); //objeto no es const. } …}
Arreglos como objetos x.length x.clone() System.arraycopy(x,0,y,0,x.length); int[] y= Arrays.copyOf(x,x.length); Arrays.fill(x,1); Arrays.sort(x); int pos= Arrays.binarySearch(new int[]{1,4,6,8}, 6); //pos= 2
TDA: Colección lineal de enteros
public class IntArray { public static final int DEFAULT_CAPACITY = 5; private int count; private int[] data; public IntArray() { this(DEFAULT_CAPACITY); }
public IntArray(int capacity) { if (capacity <= 0) data= new int[DEFAULT_CAPACITY]; else data= new int[capacity]; } public IntArray(int[] source, int sourceCount) {…} public IntArray(int[] source) {…} public IntArray(IntArray source) {…}
public void add(int item) { if (count == data.length) ensureCapacity(count + 1); data[count++]= item; } public int find(int item) { int i= 0; while (i<count && item!=data[i]) i++; return i < count ? i : -1;
public void add(int index, int item) { if (count == data.length) ensureCapacity(DEFAULT_CAPACITY); System.arraycopy(data,index,data, index+1,count-index); data[index]= item; count++; }
public void addAll(int[] source, int countSource) { for (int i= 0; i < countSource; i++) add(source[i]); } public void addAll(int[] source) { addAll(source, source.length);
public void addAll(IntArray source) { for(int i= 0; i<source.getCount(); i++) add(source.get(i)); } public void clear() { if (count > 0){ Arrays.fill(data, 0, count, 0); count = 0;
public float average() { return (float)sum()/count; } public boolean exists(int item) { return find(item) != -1; public boolean isEmpty() { return count == 0;
public int get(int index) { return data[index]; } public int getCount() { return count;
private void ensureCapacity(int minCapacity) { int[] newData= new int[data.length + minCapacity)]; System.arraycopy(data, 0,newData, 0, count); data = newData; }
public int findLast(int item) { int i = count - 1; while (i >= 0 && item != data[i]) i--; return i >= 0 ? i : -1; } public int set(int index, int item) { int result = data[index]; data[index] = item; return result;
public int remove(int index) { int result = data[index]; if (index != --count - 1) System.arraycopy(data,index+1, data,index,count-index); data[count] = 0; return result; }
public int countEqualNumber(int number) { …} public int countBiggerThan(int number) { …} public int countSmallerThan(int number) {…} public int indexBiggerValue() {…} public int indexLowerValue() {…} public int sum() {…}
¿Qué hacer si la colección no es de enteros? float ¿Soluciones?
Soluciones private float[] data; public boolean exists(float item) 1) public class FloatArray { private float[] data; public boolean exists(float item) { return find(item) != -1; } … } 2) Utilizar tipos genéricos o plantillas
IntArray como instancia miembro Procesar los resultados de Cuba en Atenas. 12 equipos. Cada equipo: nombre, colectivo o individual, cantidad de hombres y de mujeres, medallas de oro, plata y bronce. Se conoce el total de medallas alcanzadas por el país en las últimas 5 olimpiadas precedentes en las que ha participado.
Ejemplo Sidney … Cuba 10 12 8 20 50 no 8 6 2 3 5 7 1 si 27 … Equipo Colec Hom Muj Oro Plat Bron Judo no 8 6 2 3 Atlet 5 7 1 BaseB si 27 … Sidney … Cuba 10 12 8 20 50
Se desea obtener Total de deportistas que participaron. Total de medallas de un equipo. Total de medallas obtenidas. Equipo colectivo con más medallas de oro. Promedio de medallas de un equipo Si las medallas obtenidas en Atenas superan el promedio de medallas obtenidas en las 5 olimpiadas precedentes.
Con arreglos paralelos public class Olympic { private String[] arrTeam; private boolean[] arrIndividual; private int[] arrGold; private int[] arrSilver; private int[] arrBronze; private int[] arrFemale; private int[] arrMale; private int[] arrHistorical; …
Con instancias colecciones public class Olympic { private StringArray team; private BooleanArray individual; private IntArray gold; private IntArray silver; private IntArray bronze; private IntArray female; private IntArray male; private IntArray historical; …
Modelando todos los objetos Team int bronze int female int gold boolean indiv String name int male int silver … Olympic int count Team[] team IntArray historical … 1 *
Conclusiones Importancia de implementar TDA