Tema05

9
Colecciones en Java El lenguaje Java — Tema 5 — Colecciones Curso de Java Curso de Java Tema 5 – Colecciones - 1 Luis Hernández Yáñez Carlos Cervigón Rückauer Índice Cadenas de caracteres: la clase String ... 2 Creación de cadenas ... 3 Lectura, longitud y acceso a los caracteres individuales ... 4 Comparación de cadenas ... 5 Concatenación ... 7 El método estándar toString ... 8 Subcadenas ... 9 Ejemplos ... 10 Una clase con atributos de clase String ... 16 La clase Array ... 19 Acceso a los elementos del array ... 21 Arrays de objetos ... 23 Una clase Lista ... 24 Colecciones en Java Curso de Java Tema 5 – Colecciones - 2 Luis Hernández Yáñez Carlos Cervigón Rückauer Una de las colecciones que más a menudo utilizamos es la cadena de caracteres. Una cadena de caracteres es una secuencia de caracteres que se guardan juntos y en orden en una variable. Bueno, más bien en un objeto, ya que en Java usamos una clase muy versátil para las cadenas de caracteres: la clase String. Es una clase de la biblioteca estándar. Hay que tener muy en cuenta que las cadenas de caracteres que se mantienen en objetos de la clase String no se pueden modificar. Son objetos constantes que contienen la cadena que se les haya proporcionado cuando se crearon. Cadenas de caracteres: la clase String Curso de Java Tema 5 – Colecciones - 3 Luis Hernández Yáñez Carlos Cervigón Rückauer Creación de cadenas Se crean como cualquier otro objeto: String cadena = new String(cad); donde cadena es el nombre para el objeto y cad es la cadena de caracteres literal que se quiere mantener en el objeto String. Por ejemplo: String frase = new String("Me gusta programar en Java."); Como las cadenas se usan mucho, Java nos permite abreviar la creación de esta clase de objetos: String frase = "Me gusta programar en Java."; El objeto frase contendrá esa cadena durante toda su “vida”. Cadenas de caracteres: la clase String

Transcript of Tema05

Page 1: Tema05

Colecciones en Java

El lenguaje Java — Tema 5 — Colecciones

Curso de Java

Curso de Java Tema 5 – Colecciones - 1Luis Hernández YáñezCarlos Cervigón Rückauer

ÍndiceCadenas de caracteres: la clase String ... 2

Creación de cadenas ... 3Lectura, longitud y acceso a los caracteres individuales ... 4Comparación de cadenas ... 5Concatenación ... 7El método estándar toString ... 8Subcadenas ... 9Ejemplos ... 10

Una clase con atributos de clase String ... 16La clase Array ... 19

Acceso a los elementos del array ... 21Arrays de objetos ... 23Una clase Lista ... 24

Colecciones en Java

Curso de Java Tema 5 – Colecciones - 2Luis Hernández YáñezCarlos Cervigón Rückauer

Una de las colecciones que más a menudo utilizamos es la cadena de caracteres.

Una cadena de caracteres es una secuencia de caracteres que se guardan juntos y en orden en una variable.

Bueno, más bien en un objeto, ya que en Java usamos una clase muy versátil para las cadenas de caracteres: la clase String.

Es una clase de la biblioteca estándar.

Hay que tener muy en cuenta que las cadenas de caracteres que semantienen en objetos de la clase String no se pueden modificar.

Son objetos constantes que contienen la cadena que se les haya proporcionado cuando se crearon.

Cadenas de caracteres: la clase String

Curso de Java Tema 5 – Colecciones - 3Luis Hernández YáñezCarlos Cervigón Rückauer

Creación de cadenas

Se crean como cualquier otro objeto:String cadena = new String(cad);

donde cadena es el nombre para el objeto y cad es la cadena de caracteres literal que se quiere mantener en el objeto String.

Por ejemplo:String frase = new String("Me gusta programar en Java.");

Como las cadenas se usan mucho, Java nos permite abreviar la creación de esta clase de objetos:String frase = "Me gusta programar en Java.";

El objeto frase contendrá esa cadena durante toda su “vida”.

Cadenas de caracteres: la clase String

Page 2: Tema05

Curso de Java Tema 5 – Colecciones - 4Luis Hernández YáñezCarlos Cervigón Rückauer

Lectura de cadenas

Para obtener un objeto String que contenga la secuencia de caracteres introducida por el usuario con el teclado, la clase MyInput proporciona el método readString().String frase = MyInput.readString();

El método readString() ya se encarga de crear el objeto.

Longitud y acceso a caracteres individuales

Para saber cuál es la longitud de la cadena (el número de caracteres que contiene) se usa el método length():int longitud = frase.length();

Se puede acceder a los caracteres individuales con el método charAt(índice), donde índice va de 0 a longitud-1:for(int i = 0; i < frase.length(); i++)

System.out.print(frase.charAt(i));

Cadenas de caracteres: la clase String

Asegurarse de que el índice sea válido

Curso de Java Tema 5 – Colecciones - 5Luis Hernández YáñezCarlos Cervigón Rückauer

Comparación de cadenas

Como las cadenas son objetos, las variables correspondientes sonreferencias y ya sabemos que cuando comparamos referencias lo que comprobamos es si apuntan al mismo objeto, no si se trata de la misma secuencia de caracteres.

String frase1 = new String("Hola");

String frase2 = "Hola";

if(frase1 != frase2)

System.out.println("No son el mismo objeto.");

String frase4 = frase1;

if(frase1 == frase4)

System.out.println("Son el mismo objeto.");

Cadenas de caracteres: la clase String

Curso de Java Tema 5 – Colecciones - 6Luis Hernández YáñezCarlos Cervigón Rückauer

Para saber si dos objetos contienen la misma secuencia de caracteres se puede utilizar el método equals(String).

String frase1 = new String("Hola");String frase2 = "Hola";if(frase1.equals(frase2))

System.out.println("Contienen la misma cadena.");

Y para saber si la cadena es lexicográficamente menor o mayor que otra se puede usar el método compareTo(String), que devuelve un valor menor que cero si la cadena receptora es menor que el argumento, cero si ambas cadenas son iguales y un valor mayor que cero si la cadena receptora es mayor que el argumento.

También está definido en la clase String el método equalsIgnoreCase(String), que compara dos cadenas ignorando mayúsculas y minúsculas.

Cadenas de caracteres: la clase String

Curso de Java Tema 5 – Colecciones - 7Luis Hernández YáñezCarlos Cervigón Rückauer

Concatenación

Para concatenar la cadena receptora con otra cadena se puede utilizar el método concat(String), que devuelve otra cadena con los caracteres de la receptora seguidos de los del argumento.String frase1 = new String("Hola");String frase2 = “y adios";String frase3 = frase1.concat(frase2);System.out.println(frase3); // Holay adios

También se puede utilizar el operador + para concatenar cadenas,(ya lo hemos estado utilizando con System.out.print()).

String frase3 = frase1 + frase2;

Cadenas de caracteres: la clase String

Page 3: Tema05

Curso de Java Tema 5 – Colecciones - 8Luis Hernández YáñezCarlos Cervigón Rückauer

El método estándar toString()

Cuando en una instrucción System.out.print() (o println()) se encuentra un objeto, automáticamente se llama al método toString() de la clase del objeto. Este método devuelve un String con la información del objeto en el formato deseado.

Si el programador no ha incluido un método toString() en la clase, el compilador añade uno por su cuenta, pero seguramente la forma en que se muestre la información no nos resultará adecuada.

Lo mejor, por tanto, es añadir un método toString() propio que devuelva una cadena concatenando la información a mostrar.public String toString() { // Clase Cuenta

return "Número de la cuenta: " + _num+ "\nD.N.I. del cliente: “ + _dni + "\nSaldo: "+ _saldo + " euros\nInterés: " + _interes + " %";

}

Cadenas de caracteres: la clase String

Curso de Java Tema 5 – Colecciones - 9Luis Hernández YáñezCarlos Cervigón Rückauer

Subcadenas

Para obtener una subcadena de la cadena receptora se utiliza el método substring(int, int).

El primer argumento es el carácter (índice) por el que se quiereempezar a copiar y el segundo argumento indica el primer carácter (índice) que ya no se quiere incluir en la copia. Si no se proporciona un segundo argumento, la subcadena llega hasta el final.String frase1 = "abcdefghijklm";String frase2 = frase1.substring(2, 6); // cdefString frase3 = frase1.substring(6); // ghijklm

Para saber si un cadena se encuentra dentro de la cadena receptora se utiliza el método indexOf(String), que devuelve el carácter en el que empieza esa cadena como subcadena en la receptora(-1 si no se encuentra).

Cadenas de caracteres: la clase String

Cadenas.java

Curso de Java Tema 5 – Colecciones - 10Luis Hernández YáñezCarlos Cervigón Rückauer

Ejemplo: inversión de una cadena

Pedir una cadena, copiarla al revés en otra y mostrar ésta última.

public class Invertir {public static void main (String[] args) {System.out.print("Cadena a invertir: ");String cad = MyInput.readString();// Construir la inversa:String inversa = "";for(int i = 0; i < cad.length(); i++)inversa = cad.substring(i, i+1) + inversa;

System.out.println("Al revés: " + inversa);}

}

Cadenas de caracteres: la clase String

Invertir.java¿Cuántos objetos String se crean?

Curso de Java Tema 5 – Colecciones - 11Luis Hernández YáñezCarlos Cervigón Rückauer

for(int i = 0; i < 4; i++) // cad.length() es 4inversa = cad.substring(i, i+1) + inversa;

H

cad

o l a

inversa

Cadenas de caracteres: la clase String

Page 4: Tema05

Curso de Java Tema 5 – Colecciones - 12Luis Hernández YáñezCarlos Cervigón Rückauer

i = 0inversa = cad.substring(0, 1) + inversa;

H

cad

o l a

H

inversa

Cadenas de caracteres: la clase String

Curso de Java Tema 5 – Colecciones - 13Luis Hernández YáñezCarlos Cervigón Rückauer

i = 0inversa = cad.substring(0, 1) + inversa;

H

cad

o l a

H

H

inversa

Cadenas de caracteres: la clase String

Curso de Java Tema 5 – Colecciones - 14Luis Hernández YáñezCarlos Cervigón Rückauer

i = 0inversa = cad.substring(0, 1) + inversa;

H

cad

o l a

H

H

inversa

Dos objetos creados (y perdidos)en cada iteración

. . .

Cadenas de caracteres: la clase String

Curso de Java Tema 5 – Colecciones - 15Luis Hernández YáñezCarlos Cervigón Rückauer

Ejemplo: reemplazo de texto en una cadena

Función que sustituye todas las ocurrencias de un texto (anterior) por otro texto (nueva) en una cadena.

String reemplaza(String cadena, String anterior,String nueva) {

int estaEn;do {estaEn = cadena.indexOf(anterior);if(estaEn != -1)cadena = cadena.substring(0, estaEn) + nueva +cadena.substring(estaEn + anterior.length());

} while(estaEn != -1);return cadena;

}

Cadenas de caracteres: la clase String

Reemplaza.java

Page 5: Tema05

Curso de Java Tema 5 – Colecciones - 16Luis Hernández YáñezCarlos Cervigón Rückauer

Clase Personapublic class Persona {

private Nif nif;private int edad;private String nombre, apellidos;// Constructor predeterminadopublic Persona() {

nif = new Nif();edad = 0;nombre = new String("");apellidos = new String("");

}// Constructor parametrizadopublic Persona(long dni, int edad, String nombre,

String apellidos) {this.nif = new Nif(dni);this.edad = edad;this.nombre = nombre;this.apellidos = apellidos;

}

Una clase con atributos de clase String

Curso de Java Tema 5 – Colecciones - 17Luis Hernández YáñezCarlos Cervigón Rückauer

// Accedentespublic Nif dameNif() { return nif; }public int dameEdad() { return edad; }public String dameNombre() { return nombre; }public String dameApellidos() { return apellidos; }

// Mutadorespublic void ponNif(Nif nif) { this.nif = nif; }public void ponEdad(int edad) { this.edad = edad; }public void ponNombre(String nombre) { this.nombre = nombre; }public void ponApellidos(String apellidos) { this.apellidos = apellidos; }

// Resto de métodos

public void ponDni(long dni) { nif.ponDni(dni); }

public String toString() {return nif.toString() + "\n" + nombreCompleto()

+ "\nEdad: " + edad + "\n";}

Una clase con atributos de clase String

Curso de Java Tema 5 – Colecciones - 18Luis Hernández YáñezCarlos Cervigón Rückauer

public String nombreCompleto() { // nombre y apellidosreturn nombre + " " + apellidos;

}

public void leer() { // lectura de los datos de la personanif.leer();System.out.print("Nombre: ");nombre = MyInput.readString();System.out.print("Apellidos: ");apellidos = MyInput.readString();System.out.print("Edad: ");edad = MyInput.readInt();

}}

Una clase con atributos de clase String

Persona.java

Curso de Java Tema 5 – Colecciones - 19Luis Hernández YáñezCarlos Cervigón Rückauer

La forma más básica de crear colecciones en Java (distintas de las cadenas de caracteres) es utilizando arrays.

Para crear arrays Java proporciona la clase Array.Los arrays son, por tanto, objetos que se han de crear.

Para declarar una variable array se indica el tipo (o clase) de los elementos que se van a colocar en el mismo y unos corchetes para especificar que se trata de un array. Los corchetes pueden ir detrás del tipo o detrás del nombre de la variable:double numeros[];double[] masNumeros;Cuenta[] banco;Empleado empresa[];bool[] interruptores;

Los arrays son colecciones homogéneas, de forma que todos los elementos son de un mismo tipo (el tipo base del array).

La clase Array

Page 6: Tema05

Curso de Java Tema 5 – Colecciones - 20Luis Hernández YáñezCarlos Cervigón Rückauer

Todavía no tenemos ningún array disponible. Como los arrays son objetos hay que crearlos, como siempre con la instrucción new.En la creación es cuando se especifica la longitud del array, el número de posiciones (elementos) que se desea tener.

La capacidad se indica entre corchetes a continuación del tipo:numeros = new double[10];masNumeros = new double[25];banco = new Cuenta[1000];empresa = new Empleado[60];interruptores = new bool[4];

Y, por supuesto, se pueden crear al declararlos:double numeros[] = new double[10];double[] masNumeros = new double[25];Cuenta[] banco = new Cuenta[1000];Empleado empresa[] = new Empleado[60];bool[] interruptores = new bool[4];

La clase Array

Curso de Java Tema 5 – Colecciones - 21Luis Hernández YáñezCarlos Cervigón Rückauer

Acceso a los elementos del array

Las posiciones del array se acceden por índice, siempre un entero.Para acceder a un elemento del array se pone el índice entre corchetes a continuación del nombre del array:numeros[índice] banco[índice]

La primera posición del array es la 0 y la última la longitud menos 1.

Debemos asegurarnos de que la posición a la que queramos accedersea una posición válida. Si no, se elevará una excepción y se interrumpirá la ejecución del programa.

Los elementos del array numeros son:

numeros[0] numeros[1] numeros[2] ... numeros[9]

Y los del array banco son:

banco[0] banco[1] banco[2] ... banco[999]

La clase Array

Curso de Java Tema 5 – Colecciones - 22Luis Hernández YáñezCarlos Cervigón Rückauer

Los arrays disponen de una propiedad (atributo público) denominada length que contiene el número de posiciones del array.

int longitud = numeros.length; // No es un método!

Se recomienda utilizar la propiedad length en lugar del número de posiciones indicado al crear el array.for(int i = 0; i < banco.length; i++)

banco[i].println();

Cuando se trabaja con arrays de objetos, antes de acceder a un objeto de una posición del array hay que estar seguro de que en esa posición efectivamente hay un objeto (se apunta a un objeto). No hay que olvidar que se trata de referencias.for(int i = 0; i < banco.length; i++)

if(banco[i] != null) banco[i].println();

Sea como sea, hay que estar seguro.

La clase Array

Curso de Java Tema 5 – Colecciones - 23Luis Hernández YáñezCarlos Cervigón Rückauer

Vamos a usar la clase Array para crear listas de objetos.

El array lo necesitamos para mantener los distintos objetos que se coloquen en la lista (bueno, las referencias a los objetos).

Para guardar objetos de una clase en un array basta con definir un array cuyo tipo base sea esa clase:Persona _array[];

Y como ya sabemos, el array se crea así:_array = new Persona[100];

El array ya está listo para que se asignen Personas a las distintas posiciones del array según se necesite.

La creación del array no crea ningún objeto de clase Persona. Las Personas que se quieran colocar en el array se deberán crear antes de colocarlas.

Arrays de objetos

Page 7: Tema05

Curso de Java Tema 5 – Colecciones - 24Luis Hernández YáñezCarlos Cervigón Rückauer

Una clase Lista

La lista es una estructura de datos y como tal es un elemento deprograma independiente que debe estar implementado en una clase.

El array de objetos será un atributo de la clase Lista.

Como en el array no tienen por qué estar todas las posiciones ocupadas por objetos que se hayan insertado en la lista, debemos saber cuántas posiciones están ocupadas en cada momento (y cuáles).

Lo mejor es mantener todos los objetos en posiciones contiguas, a partir de la primera (la 0), de forma que lo único que necesitamos saber es cuántos hay. Bastará un contador de elementos.

El contador de elementos será otro atributo de la clase Lista.

El contador de elementos indicará la primera posición que está disponible. Lo inicializaremos a cero y no cabrán más objetos en la lista cuando valga MAX, una constante de la clase.

Curso de Java Tema 5 – Colecciones - 25Luis Hernández YáñezCarlos Cervigón Rückauer

Atributos de la clase Lista

No necesitamos más datos, por lo que la lista de atributos será:public class Lista {

private final static int MAX = 100;private Persona _array[];private int _cont = 0; // Indica la primera posición// libre del array. Igual al número de elementos.

...

MAX es una constante de clase.

Una clase Lista

Curso de Java Tema 5 – Colecciones - 26Luis Hernández YáñezCarlos Cervigón Rückauer

Métodos de la clase Lista

Como la lista es una máquina de datos, no se debe tener acceso a sus interioridades (atributos), sino que se utilizará exclusivamente a través de las operaciones definidas.

No ya es que no tenga utilidad conocer los valores de los atributos (el contador y el array), sino que se podría hacer que la máquinafallase si se modificaran sus atributos (¡el contador indicando más allá de la primera posición vacía!).

Por tanto, no definiremos en la clase Lista ni accedentes ni mutadores, excepto un accedente para el contador.

El resto de los métodos se corresponderán con operaciones específicas de la lista como estructura de datos.

Una clase Lista

Curso de Java Tema 5 – Colecciones - 27Luis Hernández YáñezCarlos Cervigón Rückauer

Como se trata de un ejemplo de lista, no vamos a implementar un conjunto completo de operaciones, sino tan sólo algunas que nos permitan probar suficientemente la lista.

¿Caben más objetos?El método llena() devolverá true si no caben más objetosy false en caso contrario.¿Hay algún objeto que se pueda recuperar?El método vacia() devolverá true si no hay objetosy false en caso contrario.Nuevo elementoEl método insertar() insertará el objeto que acepta en la lista.Obtener elementoEl método recuperar() devolverá el objeto dada una posición de la lista. Aunque la primera posición del array es la 0, para este método se indicará la primera posición de la lista como la 1.Visualización: método toString().

Una clase Lista

Page 8: Tema05

Curso de Java Tema 5 – Colecciones - 28Luis Hernández YáñezCarlos Cervigón Rückauer

Métodos que indican su éxito o fracaso

A menudo implementaremos, como métodos, operaciones que pueden fallar. Por ejemplo, si la lista está llena, el método insertar() no podrá insertar el objeto en la lista tal como se le solicita. Y si al método recuperar() se le pasa una posición en la que no hay objeto también fallará (no habrá objeto que devolver).

Cuando una operación que no tiene que devolver nada puede fallar(como insertar()), el método debe indicar el éxito o el fallo de la operación. ¿Cómo? Por ejemplo, devolviendo un valor boolean que lo indique (true si éxito y false si fallo).

El método recuperar(), sin embargo, devuelve algo: la Personaque se encuentra en la posición solicitada. En el caso de que laposición no sea válida, deberá indicar que la operación ha fallado.

Ahora se puede indicar sencillamente que no hay objeto que devolver. Y ya sabemos que para eso está el valor especial null.

Una clase Lista

Curso de Java Tema 5 – Colecciones - 29Luis Hernández YáñezCarlos Cervigón Rückauer

Una clase Lista

public class Lista {private final static int MAX = 100;private Persona _array[];private int _cont = 0; // Indica la primera posición// libre del array. Igual al número de elementos

public Lista() { _array = new Persona[MAX]; }

public boolean llena() { return _cont == MAX; }

public boolean vacia() { return _cont == 0; }

public int length() { return _cont; }

public boolean insertar(Persona p) {// Devuelve true si se inserta; false si lista llenaif(_cont == MAX) return false;_array[_cont] = p;_cont++;return true;

} (continúa)

Curso de Java Tema 5 – Colecciones - 30Luis Hernández YáñezCarlos Cervigón Rückauer

Una clase Lista

public Persona recuperar(int pos) {// pos: 1 ... _cont// true si tiene éxito; false si posición no válidaif((pos < 1) || (pos > _cont)) return null;return _array[pos-1];

}

public String toString() {String cad = "Elementos de la lista:\n\n";for(int i = 0; i < _cont; i++)cad += _array[i].toString() + "\n";

return cad;}

}

PersonaLista 0..MAX

Lista.java

Nif1

Curso de Java Tema 5 – Colecciones - 31Luis Hernández YáñezCarlos Cervigón Rückauer

Se debe tener muy presenteque lo que se coloca en las posiciones del array son referencias a objetos, por lo que si se inserta dos veces el mismo objeto Persona, habrá dos posiciones que apunten al mismo objeto.Persona per = new Persona();Lista lista = new Lista();lista.insertar(per);lista.insertar(per);...

Una clase Lista

2

ObjetoPersona

...

_array

_cont

lista

PruebaLista.java

Page 9: Tema05

Curso de Java Tema 5 – Colecciones - 32Luis Hernández YáñezCarlos Cervigón Rückauer

tipo[][] idMatriz = new tipo[t1][t2];

tipo[][][]idMatriz = new tipo[t1][t2][t3];

Arrays: varias dimensiones

Definición : int[][] tabla = new int[4][10];

Acceso a los elementos : tabla[2][5]...

int a,b,c;

double[][] otraTabla = new int[a][b*c];

int[][] tabla2 = {{1,2,3},{4,5,6},{7,8,9}};

...

float tabla3[][] = new float[4][];

tabla3[0] = new float[5];

tabla3[1] = new float[10]; Sólo se puede hacer al definirla

Curso de Java Tema 5 – Colecciones - 33Luis Hernández YáñezCarlos Cervigón Rückauer

Ejemplo: matriz identidad

public class PruebaMatriz {

public static void main(String[] args){

int[][] m = new int[4][4];

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

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

if (i==j)m[i][j]=1;

else m[i][j]=0;}

}

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

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

System.out.print (m[i][j]+” “);}

System.out.println();

}

}

}

1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

Curso de Java Tema 5 – Colecciones - 34Luis Hernández YáñezCarlos Cervigón Rückauer

Ejemplo: máximo de matriz

public class Maximo {

static int mayor(int[][] a){

int mayor=a[0][0];

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

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

if (mayor<a[i][j]) mayor=a[i][j]; }

}

return mayor;

}

public static void main(String[] args) {

int[][]m = {{23,3,95},{13,42,12}};

System.out.println(mayor(m));

}

}

Curso de Java Tema 5 – Colecciones - 35Luis Hernández YáñezCarlos Cervigón Rückauer

Crea una clase Tablero que modele un tablero de 5x5;

Atributos:

La matriz que representa al tablero

Métodos:

Constructor : inicializa el tablero con valores double aleatorios (entre 0 y 1)

toString() : permite mostrar el tablero en formato filas y columnas

vacia(int fil, int col) : pone a cero la casilla indicada por los parámetros

Crea una clase PruebaTablero que cree un tablero de ejemplo y lo muestre

Ejercicio: una clase Tablero

Tablero.javaPruebaTablero.java