Vous êtes sur la page 1sur 17

Arreglos

Objetivos

 Manipularuna colección de valores de


dato, usando un arreglo.
 Declarary usar un arreglo de datos
primitivos.
 Declarar y usar un arreglo de objetos

1
Arreglos Introducción

 Un arreglo (array) es una colección de valores


de dato.
 Si su programa necesita tratar con 100 enteros,
500 objetos cuentas, 365 números reles, etc.,
conviene usar arreglos
 En Java, un arreglo es una colección indexada
de valores de datos del mismo tipo.

Arreglo de datos Primitivos


 Declaración de Array (dos posibilidades)
<data type> [ ] <variable> //variation 1
<data type> <variable>[ ] //variation 2
 Creación Array
<variable> = new <data type> [ <size> ]
 Ej
Variation 1 Variation 2
double[ ] rainfall; double rainfall [ ];
rainfall rainfall
= new double[12]; = new double[12];

Un array se parece a un objeto!

2
Accediendo a Elementos
Individuales
 Elementos Individuales en en un arreglo se aceden a
través de su índice.
double[] rainfall = new double[12];

rainfall
0 1 2 3 4 5 6 7 8 9 10 11

Este expresión se refiere


al elemento de la
EL índice de la 1ª rainfall[2] posición 2

posición del
arreglo es 0.

Procesando Array – Ej1


double[] rainfall = new double[12];
Esta constante
retorna la
double annualAverage, capacidad el array

sum = 0.0;

for (int i = 0; i < rainfall.length; i++) {

rainfall[i] = Double.parseDouble(
JOptionPane.showinputDialog(null,
“Lluvia " + (i+1) ) );
sum += rainfall[i];
}

annualAverage = sum / rainfall.length;

3
Procesando Arreglos – Ej 2
double[] rainfall = new double[12];
String[] monthName = new String[12];
monthName[0] = "January";
monthName[1] = "February"; Lo mismo para el
resto de los meses

double annualAverage, sum = 0.0;

for (int i = 0; i < rainfall.length; i++) {


rainfall[i] = Double.parseDouble(
JOptionPane.showinputDialog(null,
"Rainfall for "
+ monthName[i] ));
sum += rainfall[i];
}
El nombre del mes
annualAverage = sum / rainfall.length; en vez del número

Procesando Array – Ej 3
 Calcular la lluvia media para cada trimestre.

//asumir que rainfall esta declarada e inicializada


//apropiadamente

double[] quarterAverage = new double[4];


for (int i = 0; i < 4; i++) {
sum = 0;
for (int j = 0; j < 3; j++) {
//Calcula la suma
sum += rainfall[3*i + j]; //de un trimestre
}
quarterAverage[i] = sum / 3.0; // promedio
}

4
Initialización Array
 Igual que con otros tipos de datos, se puede declarar e
inicializar a la vez.

int[] number = { 2, 4, 6, 8 };

double[] samplingData = { 2.443, 8.99, 12.3, 45.009, 18.2,


9.00, 3.123, 22.084, 18.08 };

String[] monthName = { "January", "February", "March",


"April", "May", "June", "July",
"August", "September", "October",
"November", "December" };

number.length 4
samplingData.length 9
monthName.length 12

Declaración tamaño variable


 En Java, no estamos limitados a hacer una declaración de
tamaño fijo.
 El código sig le pide al usuario el tamaño del arreglo y lo
declara de acuerdo al dato ingresado:

int size;

int[] number;

size= Integer.parseInt(JOptionPane.showInputDialog(null,
"Size of an array:"));

number = new int[size];

5
Arreglo de Objetos
 En Java, además de los arreglos de datos primitivos, se
pueden declarar arreglos de objetos
 Un arreglo de datos primitivos es una herramienta
poderosa, pero un arreglo de objetos lo es aún más.
 El uso de arreglos de objetos permite modelar la
aplicación en forma más clara y lógica.

La clase Person
 Usaremos objetos Person para mostrar el uso de arreglos
de objetos.

Person latte;
La clase Person soporta
los métodos set y get
latte = new Person( );
latte.setName("Ms. Latte");
latte.setAge(20);
latte.setGender('F');

System.out.println( "Name: " + latte.getName() );


System.out.println( "Age : " + latte.getAge() );
System.out.println( "Sex : " + latte.getGender() );

6
Creando un arreglo de Objectos - 1

Código A Person[ ] person;


Sólo el nombre de person
person = new Person[20]; se ha declarado, aún no se
ha reservado el espacio
person[0] = new Person( ); para el arreglo..

person

Estado
de la
Mem.
After A is executed

Creando un arreglo de Objectos - 2

Ahora se crea el arreglo para


Código Person[ ] person; almacenar 20 objetos
personas, pero los objetos
B person = new Person[20];
mismos no se han creado
person[0] = new Person( ); aún.

person

0 1 2 3 4 16 17 18 19

Estado
de la
Mem.
After B is executed

7
Creando un arreglo de Objectos - 3

Código Person[ ] person; Un objeto persona se crea


person = new Person[20]; y se pone la referencia a
este objeto en la posición
C person[0] = new Person( ); 0.

person

0 1 2 3 4 16 17 18 19

Estado
de la Person

Mem.
After C is executed

Procesamiento del arreglo


Person –1
 Crear objetos Person y ponerlos en un arreglo
String name, inpStr;
int age;
char gender;

for (int i = 0; i < person.length; i++) {


name = JOptionPane.showInputDialog(null, “Ingrese nombre:");
age = Integer.parseInt(
JOptionPane.showInputDialog(null, “Ingrese edad:"));
inpStr = JOptionPane.showInputDialog(null, “Ingrese sexo:");
gender = inpStr.charAt(0);

person[i] = new Person( ); // crea una nueva persona


person[i].setName ( name ); // asigna los valores
person[i].setAge ( age );
person[i].setGender( gender );
}

8
Procesamiento del arreglo
Person –2
 Encontrar la edad de la persona mayor
int minIdx = 0; //índice para la persona más joven
int maxIdx = 0; //índice para la persona más vieja

for (int i = 1; i < person.length; i++) {

if ( person[i].getAge() < person[minIdx].getAge() ) {


minIdx = i; // encuentra al más joven

} else if (person[i].getAge() > person[maxIdx].getAge() ) {

maxIdx = i; // encuentra al más viejo }


}

//person[minIdx] es más joven y person[maxIdx] es el más viejo

Borrando Objectos – Ej 1
int delIdx = 1;
Borrar la persona B
A person[delIdx] = null; poniendo su referencia a
null.

person person

0 1 2 3 0 1 2 3

A B C D A C D

Before A is executed After A is executed

9
Borrando Objetos – Ej 2
int delIdx = 1, last = 3; Borrar a la persona B
person[delIndex] = person[last]; poniendo la referencia de
A la última persona en la
person[last] = null; posición 1.

person person

0 1 2 3 0 1 2 3

A B C D A D C

Before A is executed After A is executed

Procesamiento del arreglo


Person 3
 Buscando a una persona particular, se emplea el 2do método para
borrar
int i = 0;

while ( person[i] != null && !person[i].getName().equals("Latte") ) {


i++;
}

if ( person[i] == null ) {
//no encuentra a la persona - búsqueda fracasada
System.out.println("Latte no se encuentra en el arreglo");

} else {
//encuentra – búsqueda exitosa
System.out.println(“Encontró a Latte en la posición " + i);
}

10
Pasaje de arreglos a métodos

 Al igual que los objetos los arreglos son


datos de tipo referencia
 Pasamos la referencia al arreglo y no el
arreglo en sí cuando se llama al método.
 El método no crea una copia separada del
arreglo
 Cuando se pasa un arreglo a un método
sólo se pasa la referencia.
 No se crea una copia del arreglo

Arreglo de Dos-Dimensiones
 Arreglo de Dos-dimensiones son útiles para la representación
en forma tabular

11
Declarando y creando un arreglo de 2-D
Declaración
<data type> [][] <variable> //variación 1
<data type> <variable>[][] //variación 2

Creación

<variable> = new <data type> [ <size1> ][ <size2> ]

payScaleTable
0 1 2 3 4
double[][] payScaleTable;
0
payScaleTable
1
= new double[4][5];
2
3

Accediendo a los Elementos


 Un elemento en un arreglo de dos-dimensiones se accede
por el índice de fila y columna

12
Ej 2-D Procesamiento de
Arreglos
 Encontrar el promedio de c/ fila

double[ ] average = { 0.0, 0.0, 0.0, 0.0 };

for (int i = 0; i < payScaleTable.length; i++) {

for (int j = 0; j < payScaleTable[i].length; j++) {

average[i] += payScaleTable[i][j];
}

average[i] = average[i] / payScaleTable[i].length;


}

Java Implemención de Arreglos de 2-D

 El Ej de creación de arreglos
payScaleTable = new double[4][5];

es una forma reducida de:


payScaleTable = new double [4][ ];

payScaleTable[0] = new double [5];


payScaleTable[1] = new double [5];
payScaleTable[2] = new double [5];
payScaleTable[3] = new double [5];

13
Problema

Escribir una clase Libro de Direcciones


que maneje una colección de objetos
Persona.
Se debe poder agregar, borrar o buscar
una persona en el libro

Plan General / Documento de


Diseño
 Ya que estamos diseñando una clase simple, nuestra tarea
es identificar los métodos públicos

Método Publico Objetivo


AddressBook Un constructor para inicializar un obj. Incluiremos
todos los constructores necesarios
add Agregar una nueva persona al libro de direcciones
delete Borrar una persona específica

search Buscar una persona dada y devolverla en caso de


encontrarla

14
Pasos de Desarrollo
 Desarrollaremos en 5 pasos:

1. Implementar el /los constructores.


2. Implementar el método agregar (add)
3. Implementar el método buscar (search)
4. Implementar el método borrar (delete).
5. Finalizar la clase.

Diseño Paso 1
 Comenzar la definición de clase con dos
constructores
 Un constructor sin argumentos crea un
vector del tamaño por defecto
 Un constructor con un argumento creará
un arreglo del tamaño especificado

15
Paso 2 Diseño
 Diseñar e implementar el método add
 Un array que usamos internamente para
implementar la clase AddressBook tiene un tamaño
límite
 Alternativa 1: Inhabilitar la posibilidad de agregar
elem. cdo se alcanza la capacidad
 Alternativa 2: Crear un nuevo arreglo de mayor
tamaño

 Se adopta la 2da alternativa

Paso 3 Diseño
 Diseñar e implementar el método de búsqueda search
loc = 0;
while ( loc < count &&
Nombre de la Persona en la entreda loc no es igual al
nombre dado) {
loc++;
}
if (loc == count) {
foundPerson = null;
} else {
foundPerson = entry[loc];
}

return foundPerson;

16
Paso 4 Diseño
 Diseñar e implementar el método delete
boolean status;
int loc;
loc = findIndex( searchName );

if ( loc No es válida ) {
status = false;
} else { //found, pack the hole
reeplazar el elemento con indice loc+1 por el último elem
status = true;

count--; //decrementar count, hay un elem menos


asegurarse que 'count' sea válido; // no puede quedar negativo
}
return status;

Paso 5: Finalizar
 Prueba final
 Ya que las tres operaciones (agregar, borrar y
buscar) están interrelacionadas, es importante
probarlas juntas.
 Posible Extensiones
 Una extensión útil es repasar la lista completa
(scanning) .
 Listar todas las personas del libro de direcciones

17