Colecciones en Java

Í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

Curso de Java

Colecciones en Java
El lenguaje Java — Tema 5 — Colecciones

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 5 – Colecciones - 1

Cadenas de caracteres: la clase String
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
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”.

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 5 – Colecciones - 2

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 5 – Colecciones - 3

Cadenas de caracteres: la clase String
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();

Cadenas de caracteres: la clase String
Comparación de cadenas Como las cadenas son objetos, las variables correspondientes son referencias 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.");

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));
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer

Asegurarse de que el índice sea válido
Tema 5 – Colecciones - 4 Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 5

Cadenas de caracteres: la clase String
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.");

Cadenas de caracteres: la clase String
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

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.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 6

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

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 5 – Colecciones - 7

Cadenas de caracteres: la clase String
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 + " %"; }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 8

Cadenas de caracteres: la clase String
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 quiere empezar 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); // cdef String 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.java
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 9

Cadenas de caracteres: la clase String
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); } }
¿Cuántos objetos String se crean?
Luis Hernández Yáñez Carlos Cervigón Rückauer

Cadenas de caracteres: la clase String
cad

H o l a

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

inversa

Invertir.java
Tema 5 – Colecciones - 10 Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 11

Curso de Java

Cadenas de caracteres: la clase String
cad

Cadenas de caracteres: la clase String
cad

H o l a

H o l a

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

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

H

H H

inversa

inversa

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 5 – Colecciones - 12

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 5 – Colecciones - 13

Cadenas de caracteres: la clase String
cad

Cadenas de caracteres: la clase String
Ejemplo: reemplazo de texto en una cadena

H o l a

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; }

i = 0 inversa = cad.substring(0, 1) + inversa; Dos objetos creados (y perdidos) en cada iteración
H H
inversa

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

Reemplaza.java
Tema 5 – Colecciones - 15

Una clase con atributos de clase String
Clase Persona
public class Persona { private Nif nif; private int edad; private String nombre, apellidos; // Constructor predeterminado public Persona() { nif = new Nif(); edad = 0; nombre = new String(""); apellidos = new String(""); } // Constructor parametrizado public Persona(long dni, int edad, String nombre, String apellidos) { this.nif = new Nif(dni); this.edad = edad; this.nombre = nombre; this.apellidos = apellidos; }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 16

Una clase con atributos de clase String
// Accedentes public Nif dameNif() { return nif; } public int dameEdad() { return edad; } public String dameNombre() { return nombre; } public String dameApellidos() { return apellidos; } // Mutadores public 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"; }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 17

Una clase con atributos de clase String
public String nombreCompleto() { // nombre y apellidos return nombre + " " + apellidos; } public void leer() { // lectura de los datos de la persona nif.leer(); System.out.print("Nombre: "); nombre = MyInput.readString(); System.out.print("Apellidos: "); apellidos = MyInput.readString(); System.out.print("Edad: "); edad = MyInput.readInt(); } }

La clase Array
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;

Persona.java
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 18

Los arrays son colecciones homogéneas, de forma que todos los elementos son de un mismo tipo (el tipo base del array).
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 19

La clase Array
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];

La clase Array
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 acceder sea 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] banco[0]
Tema 5 – Colecciones - 20 Curso de Java

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];
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer

numeros[1] banco[1]

numeros[2] ...

...

numeros[9]

Y los del array banco son:
banco[2] banco[999]
Tema 5 – Colecciones - 21

Luis Hernández Yáñez Carlos Cervigón Rückauer

La clase Array
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!

Arrays de objetos
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[];

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();

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.

Sea como sea, hay que estar seguro.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 22

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 5 – Colecciones - 23

Una clase Lista
La lista es una estructura de datos y como tal es un elemento de programa 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 Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 24

Una clase Lista
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.

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 5 – Colecciones - 25

Una clase Lista
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áquina fallase 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
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 objetos y false en caso contrario. ¿Hay algún objeto que se pueda recuperar? El método vacia() devolverá true si no hay objetos y false en caso contrario. Nuevo elemento El método insertar() insertará el objeto que acepta en la lista. Obtener elemento El 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().
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 27

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 5 – Colecciones - 26

Una clase Lista
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 Persona que se encuentra en la posición solicitada. En el caso de que la posició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.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 28

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 llena if(_cont == MAX) return false; _array[_cont] = p; _cont++; return true; } (continúa)
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 29

Una clase Lista
public Persona recuperar(int pos) {// pos: 1 ... _cont // true si tiene éxito; false si posición no válida if((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; } }
Lista
0..MAX

Una clase Lista
Se debe tener muy presente que 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); ...
lista _array

Objeto Persona

...

_cont

Persona

1

Nif

2

Lista.java
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 30 Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer

PruebaLista.java
Tema 5 – Colecciones - 31

Arrays: varias dimensiones
tipo[][] idMatriz = new tipo[t1][t2]; tipo[][][]idMatriz = new tipo[t1][t2][t3]; Definición : int[][]
... 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];
Curso de Java

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(); } Sólo se puede hacer al definirla } }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 33 0 0 0 1 1 0 0 0

tabla = new int[4][10]; tabla[2][5]

Acceso a los elementos :

0

1

0

0

0

0

1

0

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 5 – Colecciones - 32

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 Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 34

Ejercicio: una clase Tablero
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 PruebaTablero.java Tablero.java
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 5 – Colecciones - 35