FUNDACIÓN GENERAL
Curso para IZAR
Colecciones en Java
El lenguaje Java — Tema 5 — Colecciones
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 para IZAR Tema 5 – Colecciones - 2
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.
Curso de Java para IZAR Tema 5 – Colecciones - 3
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 para IZAR Tema 5 – Colecciones - 4
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();
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++) Asegurarse de que el
System.out.print(frase.charAt(i)); índice sea válido
Curso de Java para IZAR Tema 5 – Colecciones - 5
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.");
Curso de Java para IZAR Tema 5 – Colecciones - 6
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.");
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 para IZAR Tema 5 – Colecciones - 7
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
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 para IZAR Tema 5 – Colecciones - 8
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 para IZAR Tema 5 – Colecciones - 9
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 para IZAR Tema 5 – Colecciones - 10
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?
Invertir.java
Curso de Java para IZAR Tema 5 – Colecciones - 11
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
Curso de Java para IZAR Tema 5 – Colecciones - 12
Cadenas de caracteres: la clase String
cad
H o l a
i = 0
inversa = cad.substring(0, 1) + inversa;
inversa
Curso de Java para IZAR Tema 5 – Colecciones - 13
Cadenas de caracteres: la clase String
cad
H o l a
i = 0
inversa = cad.substring(0, 1) + inversa;
H
inversa
Curso de Java para IZAR Tema 5 – Colecciones - 14
Cadenas de caracteres: la clase String
cad
H o l a
i = 0
inversa = cad.substring(0, 1) + inversa;
Dos objetos creados (y perdidos)
en cada iteración
H
H
inversa
. . .
Curso de Java para IZAR Tema 5 – Colecciones - 15
Cadenas de caracteres: la clase String
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;
}
Reemplaza.java
Curso de Java para IZAR Tema 5 – Colecciones - 16
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 para IZAR Tema 5 – Colecciones - 17
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 para IZAR Tema 5 – Colecciones - 18
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();
}
}
Persona.java
Curso de Java para IZAR Tema 5 – Colecciones - 19
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;
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 para IZAR Tema 5 – Colecciones - 20
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];
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 para IZAR Tema 5 – Colecciones - 21
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] numeros[1] numeros[2] ... numeros[9]
Y los del array banco son:
banco[0] banco[1] banco[2] ... banco[999]
Curso de Java para IZAR Tema 5 – Colecciones - 22
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!
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.
Curso de Java para IZAR Tema 5 – Colecciones - 23
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[];
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.
Curso de Java para IZAR Tema 5 – Colecciones - 24
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 para IZAR Tema 5 – Colecciones - 25
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 para IZAR Tema 5 – Colecciones - 26
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.
Curso de Java para IZAR Tema 5 – Colecciones - 27
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 para IZAR Tema 5 – Colecciones - 28
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 para IZAR Tema 5 – Colecciones - 29
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 para IZAR Tema 5 – Colecciones - 30
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;
}
}
0..MAX 1
Lista Persona Nif
Lista.java
Curso de Java para IZAR Tema 5 – Colecciones - 31
Una clase Lista
Se debe tener muy presente lista
que lo que se coloca en _array
las posiciones del array
son referencias a objetos,
por lo que si se inserta Objeto
Persona
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); _cont
... 2
PruebaLista.java
Curso de Java para IZAR Tema 5 – Colecciones - 32
Arrays: varias dimensiones
tipo[][] idMatriz = new tipo[t1][t2];
tipo[][][]idMatriz = new tipo[t1][t2][t3];
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 para IZAR Tema 5 – Colecciones - 33
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++){
1 0 0 0
for(int j=0; j<m[i].length;j++){
if (i==j)m[i][j]=1;
0 1 0 0
else m[i][j]=0;}
} 0 0 1 0
for(int i=0; i<m.length;i++){
for(int j=0; j<m[i].length;j++){ 0 0 0 1
System.out.print (m[i][j]+” “);}
System.out.println();
}
}
}
Curso de Java para IZAR Tema 5 – Colecciones - 34
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 para IZAR Tema 5 – Colecciones - 35
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 para IZAR Tema 5 – Colecciones - 36