You are on page 1of 9

Colecciones en Java

Índice
Cadenas de caracteres: la clase String ... 2
Creación de cadenas ... 3
Curso de Java 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
Colecciones en Java 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

El lenguaje Java — Tema 5 — Colecciones


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

Cadenas de caracteres: la clase String Cadenas de caracteres: la clase String

Una de las colecciones que más a menudo utilizamos es Creación de cadenas


la cadena de caracteres. Se crean como cualquier otro objeto:
Una cadena de caracteres es una secuencia de caracteres que se String cadena = new String(cad);
guardan juntos y en orden en una variable.
donde cadena es el nombre para el objeto y cad es la cadena
Bueno, más bien en un objeto, ya que en Java usamos una clase de caracteres literal que se quiere mantener en el objeto String.
muy versátil para las cadenas de caracteres: la clase String.
Por ejemplo:
Es una clase de la biblioteca estándar.
String frase = new String("Me gusta programar en Java.");
Como las cadenas se usan mucho, Java nos permite abreviar
Hay que tener muy en cuenta que las cadenas de caracteres que se
la creación de esta clase de objetos:
mantienen en objetos de la clase String no se pueden modificar.
String frase = "Me gusta programar en Java.";
Son objetos constantes que contienen la cadena que se les haya
proporcionado cuando se crearon. El objeto frase contendrá esa cadena durante toda su “vida”.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 2 Curso de Java Tema 5 – Colecciones - 3
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Cadenas de caracteres: la clase String Cadenas de caracteres: la clase String

Lectura de cadenas Comparación de cadenas


Para obtener un objeto String que contenga la secuencia Como las cadenas son objetos, las variables correspondientes son
de caracteres introducida por el usuario con el teclado, referencias y ya sabemos que cuando comparamos referencias lo
la clase MyInput proporciona el método readString(). que comprobamos es si apuntan al mismo objeto, no si se trata
String frase = MyInput.readString(); de la misma secuencia de caracteres.
El método readString() ya se encarga de crear el objeto. String frase1 = new String("Hola");
String frase2 = "Hola";
Longitud y acceso a caracteres individuales
if(frase1 != frase2)
Para saber cuál es la longitud de la cadena (el número de caracteres System.out.println("No son el mismo objeto.");
que contiene) se usa el método length(): String frase4 = frase1;
int longitud = frase.length(); if(frase1 == frase4)
Se puede acceder a los caracteres individuales con el método System.out.println("Son el mismo objeto.");
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

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 4 Curso de Java Tema 5 – Colecciones - 5
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Cadenas de caracteres: la clase String Cadenas de caracteres: la clase String

Para saber si dos objetos contienen la misma secuencia de Concatenación


caracteres se puede utilizar el método equals(String).
Para concatenar la cadena receptora con otra cadena se puede
String frase1 = new String("Hola"); utilizar el método concat(String), que devuelve otra cadena
String frase2 = "Hola"; con los caracteres de la receptora seguidos de los del argumento.
if(frase1.equals(frase2))
System.out.println("Contienen la misma cadena."); String frase1 = new String("Hola");
String frase2 = “y adios";
Y para saber si la cadena es lexicográficamente menor o mayor String frase3 = frase1.concat(frase2);
que otra se puede usar el método compareTo(String), System.out.println(frase3); // Holay adios
que devuelve un valor menor que cero si la cadena receptora También se puede utilizar el operador + para concatenar cadenas,
es menor que el argumento, cero si ambas cadenas son iguales (ya lo hemos estado utilizando con System.out.print()).
y un valor mayor que cero si la cadena receptora es mayor que
el argumento. String frase3 = frase1 + frase2;

También está definido en la clase String el método


equalsIgnoreCase(String), que compara dos cadenas
ignorando mayúsculas y minúsculas.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 6 Curso de Java Tema 5 – Colecciones - 7
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Cadenas de caracteres: la clase String Cadenas de caracteres: la clase String

El método estándar toString() Subcadenas


Cuando en una instrucción System.out.print() (o println()) Para obtener una subcadena de la cadena receptora se utiliza
se encuentra un objeto, automáticamente se llama al método el método substring(int, int).
toString() de la clase del objeto. Este método devuelve un
El primer argumento es el carácter (índice) por el que se quiere
String con la información del objeto en el formato deseado.
empezar a copiar y el segundo argumento indica el primer carácter
Si el programador no ha incluido un método toString() en la (índice) que ya no se quiere incluir en la copia. Si no se proporciona
clase, el compilador añade uno por su cuenta, pero seguramente la un segundo argumento, la subcadena llega hasta el final.
forma en que se muestre la información no nos resultará adecuada. String frase1 = "abcdefghijklm";
Lo mejor, por tanto, es añadir un método toString() propio que String frase2 = frase1.substring(2, 6); // cdef
devuelva una cadena concatenando la información a mostrar. String frase3 = frase1.substring(6); // ghijklm

public String toString() { // Clase Cuenta Para saber si un cadena se encuentra dentro de la cadena receptora
return "Número de la cuenta: " + _num se utiliza el método indexOf(String), que devuelve el carácter
+ "\nD.N.I. del cliente: “ + _dni + "\nSaldo: " en el que empieza esa cadena como subcadena en la receptora
+ _saldo + " euros\nInterés: " + _interes + " %"; (-1 si no se encuentra).
} Cadenas.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 8 Curso de Java Tema 5 – Colecciones - 9
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Cadenas de caracteres: la clase String Cadenas de caracteres: la clase String

Ejemplo: inversión de una cadena cad


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

public class Invertir { for(int i = 0; i < 4; i++) // cad.length() es 4


public static void main (String[] args) { inversa = cad.substring(i, i+1) + inversa;
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;
inversa
System.out.println("Al revés: " + inversa);
}
}
¿Cuántos objetos String se crean?
Invertir.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 10 Curso de Java Tema 5 – Colecciones - 11
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Cadenas de caracteres: la clase String Cadenas de caracteres: la clase String

cad cad
H o l a H o l a

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

H H

H
inversa inversa

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 12 Curso de Java Tema 5 – Colecciones - 13
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Cadenas de caracteres: la clase String Cadenas de caracteres: la clase String

cad 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.
i = 0
inversa = cad.substring(0, 1) + inversa; String reemplaza(String cadena, String anterior,
String nueva) {
Dos objetos creados (y perdidos) int estaEn;
en cada iteración do {
H estaEn = cadena.indexOf(anterior);
if(estaEn != -1)
H cadena = cadena.substring(0, estaEn) + nueva +
inversa cadena.substring(estaEn + anterior.length());
} while(estaEn != -1);
return cadena;
}
. . . Reemplaza.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 14 Curso de Java Tema 5 – Colecciones - 15
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Una clase con atributos de clase String Una clase con atributos de clase String

Clase Persona // Accedentes


public Nif dameNif() { return nif; }
public class Persona { public int dameEdad() { return edad; }
private Nif nif; public String dameNombre() { return nombre; }
private int edad; public String dameApellidos() { return apellidos; }
private String nombre, apellidos;
// Constructor predeterminado // Mutadores
public Persona() { public void ponNif(Nif nif) { this.nif = nif; }
nif = new Nif(); public void ponEdad(int edad) { this.edad = edad; }
edad = 0; public void ponNombre(String nombre)
nombre = new String(""); { this.nombre = nombre; }
apellidos = new String(""); public void ponApellidos(String apellidos)
} { this.apellidos = apellidos; }
// Constructor parametrizado // Resto de métodos
public Persona(long dni, int edad, String nombre,
String apellidos) { public void ponDni(long dni) { nif.ponDni(dni); }
this.nif = new Nif(dni); public String toString() {
this.edad = edad; return nif.toString() + "\n" + nombreCompleto()
this.nombre = nombre; + "\nEdad: " + edad + "\n";
this.apellidos = apellidos; }
}
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 5 – Colecciones - 16 Curso de Java Tema 5 – Colecciones - 17
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Una clase con atributos de clase String La clase Array

public String nombreCompleto() { // nombre y apellidos La forma más básica de crear colecciones en Java (distintas de las
return nombre + " " + apellidos;
}
cadenas de caracteres) es utilizando arrays.
Para crear arrays Java proporciona la clase Array.
public void leer() { // lectura de los datos de la persona
nif.leer();
Los arrays son, por tanto, objetos que se han de crear.
System.out.print("Nombre: "); Para declarar una variable array se indica el tipo (o clase)
nombre = MyInput.readString();
System.out.print("Apellidos: ");
de los elementos que se van a colocar en el mismo y unos corchetes
apellidos = MyInput.readString(); para especificar que se trata de un array. Los corchetes pueden ir
System.out.print("Edad: "); detrás del tipo o detrás del nombre de la variable:
edad = MyInput.readInt();
} double numeros[];
} double[] masNumeros;
Cuenta[] banco;
Empleado empresa[];
bool[] interruptores;
Los arrays son colecciones homogéneas, de forma que todos los
Persona.java elementos son de un mismo tipo (el tipo base del array).

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 18 Curso de Java Tema 5 – Colecciones - 19
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
La clase Array La clase Array

Todavía no tenemos ningún array disponible. Como los arrays son Acceso a los elementos del array
objetos hay que crearlos, como siempre con la instrucción new.
Las posiciones del array se acceden por índice, siempre un entero.
En la creación es cuando se especifica la longitud del array, Para acceder a un elemento del array se pone el índice entre
el número de posiciones (elementos) que se desea tener. corchetes a continuación del nombre del array:
La capacidad se indica entre corchetes a continuación del tipo: numeros[índice] banco[índice]
numeros = new double[10];
masNumeros = new double[25]; La primera posición del array es la 0 y la última la longitud menos 1.
banco = new Cuenta[1000]; Debemos asegurarnos de que la posición a la que queramos acceder
empresa = new Empleado[60]; sea una posición válida. Si no, se elevará una excepción y se
interruptores = new bool[4];
interrumpirá la ejecución del programa.
Y, por supuesto, se pueden crear al declararlos: Los elementos del array numeros son:
double numeros[] = new double[10];
numeros[0] numeros[1] numeros[2] ... numeros[9]
double[] masNumeros = new double[25];
Cuenta[] banco = new Cuenta[1000]; Y los del array banco son:
Empleado empresa[] = new Empleado[60];
banco[0] banco[1] banco[2] ... banco[999]
bool[] interruptores = new bool[4];

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 20 Curso de Java Tema 5 – Colecciones - 21
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

La clase Array Arrays de objetos

Los arrays disponen de una propiedad (atributo público) denominada Vamos a usar la clase Array para crear listas de objetos.
length que contiene el número de posiciones del array.
El array lo necesitamos para mantener los distintos objetos que
int longitud = numeros.length; // No es un método! se coloquen en la lista (bueno, las referencias a los objetos).
Se recomienda utilizar la propiedad length en lugar del número de Para guardar objetos de una clase en un array basta con definir
posiciones indicado al crear el array. un array cuyo tipo base sea esa clase:
for(int i = 0; i < banco.length; i++) Persona _array[];
banco[i].println();
Y como ya sabemos, el array se crea así:
Cuando se trabaja con arrays de objetos, antes de acceder a un
_array = new Persona[100];
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). El array ya está listo para que se asignen Personas a las distintas
No hay que olvidar que se trata de referencias. posiciones del array según se necesite.
for(int i = 0; i < banco.length; i++) La creación del array no crea ningún objeto de clase Persona.
if(banco[i] != null) banco[i].println(); Las Personas que se quieran colocar en el array se deberán crear
Sea como sea, hay que estar seguro. antes de colocarlas.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 22 Curso de Java Tema 5 – Colecciones - 23
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Una clase Lista Una clase Lista

La lista es una estructura de datos y como tal es un elemento de Atributos de la clase Lista
programa independiente que debe estar implementado en una clase. No necesitamos más datos, por lo que la lista de atributos será:
El array de objetos será un atributo de la clase Lista. public class Lista {
Como en el array no tienen por qué estar todas las posiciones private final static int MAX = 100;
ocupadas por objetos que se hayan insertado en la lista, private Persona _array[];
private int _cont = 0; // Indica la primera posición
debemos saber cuántas posiciones están ocupadas
// libre del array. Igual al número de elementos.
en cada momento (y cuáles). ...
Lo mejor es mantener todos los objetos en posiciones contiguas, MAX es una constante de clase.
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.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 24 Curso de Java Tema 5 – Colecciones - 25
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Una clase Lista Una clase Lista

Métodos de la clase Lista Como se trata de un ejemplo de lista, no vamos a implementar un


Como la lista es una máquina de datos, no se debe tener acceso conjunto completo de operaciones, sino tan sólo algunas que nos
a sus interioridades (atributos), sino que se utilizará exclusivamente permitan probar suficientemente la lista.
a través de las operaciones definidas. „ ¿Caben más objetos?
El método llena() devolverá true si no caben más objetos
No ya es que no tenga utilidad conocer los valores de los atributos y false en caso contrario.
(el contador y el array), sino que se podría hacer que la máquina „ ¿Hay algún objeto que se pueda recuperar?
fallase si se modificaran sus atributos (¡el contador indicando más El método vacia() devolverá true si no hay objetos
allá de la primera posición vacía!). y false en caso contrario.
Por tanto, no definiremos en la clase Lista ni accedentes „ Nuevo elemento
ni mutadores, excepto un accedente para el contador. El método insertar() insertará el objeto que acepta en la lista.
„ Obtener elemento
El resto de los métodos se corresponderán con operaciones El método recuperar() devolverá el objeto dada una posición de la
específicas de la lista como estructura de datos. 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().

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 26 Curso de Java Tema 5 – Colecciones - 27
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Una clase Lista Una clase Lista

Métodos que indican su éxito o fracaso public class Lista {


private final static int MAX = 100;
A menudo implementaremos, como métodos, operaciones que private Persona _array[];
pueden fallar. Por ejemplo, si la lista está llena, el método private int _cont = 0; // Indica la primera posición
insertar() no podrá insertar el objeto en la lista tal como se // libre del array. Igual al número de elementos
le solicita. Y si al método recuperar() se le pasa una posición en public Lista() { _array = new Persona[MAX]; }
la que no hay objeto también fallará (no habrá objeto que devolver).
public boolean llena() { return _cont == MAX; }
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 public boolean vacia() { return _cont == 0; }
operación. ¿Cómo? Por ejemplo, devolviendo un valor boolean que public int length() { return _cont; }
lo indique (true si éxito y false si fallo). public boolean insertar(Persona p) {
El método recuperar(), sin embargo, devuelve algo: la Persona // Devuelve true si se inserta; false si lista llena
que se encuentra en la posición solicitada. En el caso de que la if(_cont == MAX) return false;
posición no sea válida, deberá indicar que la operación ha fallado. _array[_cont] = p;
_cont++;
Ahora se puede indicar sencillamente que no hay objeto que return true;
devolver. Y ya sabemos que para eso está el valor especial null. } (continúa)
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 5 – Colecciones - 28 Curso de Java Tema 5 – Colecciones - 29
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Una clase Lista Una clase Lista

public Persona recuperar(int pos) {// pos: 1 ... _cont


Se debe tener muy presente lista
// true si tiene éxito; false si posición no válida
if((pos < 1) || (pos > _cont)) return null;
que lo que se coloca en _array
return _array[pos-1]; las posiciones del array
} son referencias a objetos,
por lo que si se inserta Objeto
Persona
public String toString() { dos veces el mismo objeto
String cad = "Elementos de la lista:\n\n"; Persona, habrá dos posiciones
for(int i = 0; i < _cont; i++) que apunten al mismo objeto.
cad += _array[i].toString() + "\n";
Persona per = new Persona(); ...
return cad;
} Lista lista = new Lista();
} lista.insertar(per);
lista.insertar(per); _cont
Lista
0..MAX
Persona
1
Nif ... 2

Lista.java PruebaLista.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 5 – Colecciones - 30 Curso de Java Tema 5 – Colecciones - 31
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Arrays: varias dimensiones Ejemplo: matriz identidad

public class PruebaMatriz {


tipo[][] idMatriz = new tipo[t1][t2];
public static void main(String[] args){
tipo[][][]idMatriz = new tipo[t1][t2][t3];
int[][] m = new int[4][4];
for(int i=0; i<m.length;i++){
Definición : int[][] tabla = new int[4][10]; for(int j=0; j<m[i].length;j++){ 1 0 0 0

Acceso a los elementos : tabla[2][5] if (i==j)m[i][j]=1;


0 1 0 0
... else m[i][j]=0;}
int a,b,c; } 0 0 1 0

double[][] otraTabla = new int[a][b*c]; for(int i=0; i<m.length;i++){


int[][] tabla2 = {{1,2,3},{4,5,6},{7,8,9}}; for(int j=0; j<m[i].length;j++){ 0 0 0 1

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


float tabla3[][] = new float[4][]; System.out.println();
tabla3[0] = new float[5]; }
tabla3[1] = new float[10]; Sólo se puede hacer al definirla }
}
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 5 – Colecciones - 32 Curso de Java Tema 5 – Colecciones - 33
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Ejemplo: máximo de matriz Ejercicio: una clase Tablero

public class Maximo { Crea una clase Tablero que modele un tablero de 5x5;
static int mayor(int[][] a){
Atributos:
int mayor=a[0][0];
„ La matriz que representa al tablero
for(int i=0; i<a.length; i++){
for(int j=0; j<a[i].length;j++){ Métodos:
if (mayor<a[i][j]) mayor=a[i][j]; } „ Constructor : inicializa el tablero con valores double aleatorios
} (entre 0 y 1)
return mayor; „ toString() : permite mostrar el tablero en formato filas y
} columnas
public static void main(String[] args) { „ vacia(int fil, int col) : pone a cero la casilla indicada por
int[][]m = {{23,3,95},{13,42,12}}; los parámetros
System.out.println(mayor(m));
} Crea una clase PruebaTablero que cree un tablero de ejemplo y lo
} muestre PruebaTablero.java Tablero.java
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 5 – Colecciones - 34 Curso de Java Tema 5 – Colecciones - 35
Carlos Cervigón Rückauer Carlos Cervigón Rückauer