Mostrando las entradas con la etiqueta java. Mostrar todas las entradas
Mostrando las entradas con la etiqueta java. Mostrar todas las entradas

Lectura y escritura combinadas en ficheros en java

Las operaciones de lectura y escritura sobre ficheros se pueden combinar de tal forma que haya un flujo de lectura y otro de escritura, uno de lectura y dos de escritura, tres de lectura, etc.

En el ejemplo que presentamos a continuación hay dos flujos de lectura y uno de escritura. Observa que se declaran en total tres manejadores de fichero (dos para lectura y uno para escritura). El programa va leyendo, de forma alterna, una línea de cada fichero - una línea de fichero1.txt y otra línea de fichero2.txt - mientras queden líneas por leer en alguno de los ficheros; y al mismo tiempo va guardando esas líneas en otro fichero con nombre mezcla.txt.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
class EjemploFichero03 {
 public static void main(String[] args) {
   try {
   BufferedReader bf1 = new BufferedReader(new FileReader("fichero1.txt"));
   BufferedReader bf2 = new BufferedReader(new FileReader("fichero2.txt"));
   BufferedWriter bw = new BufferedWriter(new FileWriter("mezcla.txt"));
   String linea1 = "";
   String linea2 = "";
   while ( (linea1 != null) || (linea2 != null) ) {
    linea1 = bf1.readLine();
    linea2 = bf2.readLine();
    if (linea1 != null) bw.write(linea1 + "\n");
    if (linea2 != null) bw.write(linea2 + "\n");
   }
   bf1.close();
   bf2.close();
   bw.close();
  } catch (IOException ioe) {
   System.out.println("Se ha producido un error de lectura/escritura");
   System.err.println(ioe.getMessage());
  }
 }
}
s

Escritura sobre un fichero de texto en java

La escritura en un fichero de texto es, si cabe, más fácil que la lectura. Solo hay que cambiar System.out.print("texto") por manejador.write("texto"). Se pueden incluir saltos de línea, tabuladores y espacios igual que al mostrar un mensaje por pantalla.

 Es importante ejecutar close() después de realizar la escritura; de esta manera nos aseguramos que se graba toda la información en el disco.

Al realizar escrituras en ficheros con Java hay que tener ciertas precauciones. Cuando toca dar este tema en clase es frecuente que a más de un alumno le empiece a ir lento el ordenador, luego se le queda inutilizado y, por último, ni siquiera le arranca ¿qué ha pasado? Pues que ha estado escribiendo datos en ficheros y por alguna razón, su programa se ha metido en un bucle infinito lo que da como resultado cuelgues y ficheros de varios gigabytes de basura. Por eso es muy importante asegurarse bien de que la información que se va a enviar a un fichero es la correcta ¿cómo? muy fácil, enviándola primero a la pantalla.

A continuación se muestra un programa de ejemplo que crea un fichero de texto y luego esribe en él tres palabras, una por cada línea. 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
class EjemploFichero02 {
 public static void main(String[] args) {
 try {
  BufferedWriter bw = new BufferedWriter(new FileWriter("fruta.txt"));
  bw.write("naranja\n");
  bw.write("mango\n");
  bw.write("chirimoya\n");
  bw.close();
 } catch (IOException ioe) {
  System.out.println("No se ha podido escribir en el fichero");
 }
 }
}

Lectura de un fichero de texto en java

Aunque Java puede manejar también ficheros binarios, vamos a centrarnos exclusivamente en la utilización de ficheros de texto. Los ficheros de texto tienen una gran ventaja, se pueden crear y manipular mediante cualquier editor como por ejemplo GEdit.

Siempre que vayamos a usar ficheros, deberemos incluir al principio del programa una o varias líneas para cargar las clases necesarias. Anque se pueden cargar varias clases en una sola línea usando el asterisco de la siguiente manera:

import java.io.*;

nosotros no lo haremos así, ya que nuestro código sigue las normas del estándar de Google y estas normas lo prohiben taxativamente. Se importarán las clases usando varias líneas, una línea por cada clase que se importa en el programa; de esta forma:


import java.io.BufferedReader;import java.io.FileReader;
No es necesario saber de memoria los nombres de las clases, el entorno de desarrollo Netbeans detecta qué clases hacen falta cargar y añade los import de forma automá- tica. 

Todas las operaciones que se realicen sobre ficheros deberán estar incluidas en un bloque try-catch. Esto nos permitirá mostrar mensajes de error y terminar el programa de una forma ordenada en caso de que se produzca algún fallo - el fichero no existe, no tenemos permiso para acceder a él, etc. 

El bloque try-catch tiene el siguiente formato:  

try {         Operaciones_con_fichero} catch (tipo_de_error nombre_de_variable) {        Mensaje_de_error}
 Tanto para leer como para escribir utilizamos lo que en programación se llama un “manejador de fichero”. Es algo así como una variable que hace referencia al fichero con el que queremos trabajar.

En nuestro ejemplo, el manejador de fichero se llama bf y se crea de la siguiente manera:

BufferedReader bf = new BufferedReader(new FileReader("malaga1.txt"));

El fichero con el que vamos a trabajar tiene por nombre malaga1.txt y contiene información extraída de la Wikipedia sobre la bonita ciudad de Málaga1. A partir de aquí, siempre que queramos realizar una operación sobre ese archivo, utilizaremos su manejador de fichero asociado, es decir bf. 

En el ejemplo que se muestra a continuación, el programa lee el contenido del fichero malaga1.txt y lo muestra tal cual en pantalla, igual que si hiciéramos en una ventana de terminal cat malaga1.txt. 

Observa que se va leyendo el fichero línea a línea mediante bf.readLine() hasta que se acaban las líneas. Cuando no quedan más líneas por leer se devuelve el valor null.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
class EjemploFichero01 {
public static void main(String[] args) {
  try {
   BufferedReader bf = new BufferedReader(new FileReader("malaga1.txt"));
   String linea = "";
   while (linea != null) {
    System.out.println(linea);
    linea = bf.readLine();
   }
   bf.close();
  } catch (FileNotFoundException e) { // qué hacer si no se encuentra el fichero
   System.out.println("No se encuentra el fichero malaga.txt");
  } catch (IOException e) { // qué hacer si hay un error en la lectura del fichero
   System.out.println("No se puede leer el fichero malaga.txt");
  }
 }
}

Es importante “cerrar el fichero” cuando se han realizado todas las operaciones necesarias sobre él. En este ejemplo, esta acción se ha llevado a cabo con la sentencia bf.close().

A continuación se muestra un programa un poco más complejo. Se trata de una aplicación que pide por teclado un nombre de fichero. Previamente en ese fichero (por ejemplo numeros.txt) habremos introducido una serie de números, a razón de uno por línea. Se podrían leer también los números si estuvieran separados por comas o espacios aunque sería un poco más complicado (no mucho más). Los números pueden contener decimales ya que se van a leer como Double. Cada número que se lee del fichero se va sumando de tal forma que la suma total estará contenida en la variable suma; a la par se va llevando la cuenta de los elementos que se van leyendo en la variable i. Finalmente, dividiendo la suma total entre el número de elementos obtenemos la media aritmética de los números contenidos en el fichero.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
class EjemploFichero08 {
 public static void main(String[] args) {
  System.out.print("Introduzca el nombre del archivo donde se encuentran los números: ");
  String nombreFichero = System.console().readLine();
  try {
   BufferedReader bf = new BufferedReader(new FileReader(nombreFichero));
   String linea = "0";
   int i = 0;
   double suma = 0;
   while (linea != null) {
    i++;
    suma += Double.parseDouble(linea);
    linea = bf.readLine();
   } i
   --;
   bf.close();
   System.out.println("La media es " + suma / (double)i);
  } catch (IOException e) {
   System.out.println(e.getMessage());
  }
 }
}

Diccionarios: la clase HashMap

Imagina un diccionario inglés-español. Queremos saber qué significa la palabra “stiff”. Sabemos que en el diccionario hay muchas entradas y en cada entrada tenemos una palabra en inglés y su correspondiente traducción al español. Buscando por la “s” encontramos que “stiff” significa “agujetas”.

Un diccionario en Java funciona exactamente igual. Contiene una serie de elementos que son las entradas que a su vez están formadas por un par (clave, valor). La clave (key) permite acceder al valor. No puede haber claves duplicadas. En el ejemplo anterior, la clave sería “stiff” y el valor “agujetas”. Java dispone de varios tipos de diccionarios: HashMap, EnumMap, Hashtable, IdentityHashMap, LinkedHashMap, etc. Nosotros estudiaremos el diccionario HashMap.

Principales métodos de HashMap

Algunos de los métodos más importantes de la clase HasMap son:

get(clave)
Obtiene el valor correspondiente a una clave. Devuelve null si no existe esa clave en el diccionario.

put(clave, valor) 
Añade un par (clave, valor) al diccionario. Si ya había un valor para esa clave, se machaca.

keySet() 
Devuelve un conjunto (set) con todas las claves.

values() 
Devuelve una colección con todos los valores (los valores pueden estar duplicados a diferencia de las claves).
entrySet() 
Devuelve una colección con todos los pares (clave, valor).

containsKey(clave) Devuelve true si el diccionario contiene la clave indicada y false en caso contrario.

getKey() Devuelve la clave de la entrada. Se aplica a una sola entrada del diccionario (no al diccionario completo), es decir a una pareja (clave, valor).

Por ejemplo:

for (Map.Entry pareja: m.entrySet()) {    System.out.println(pareja.getKey());
}


getValue()Devuelve el contenido de la entrada. Se aplica a una entrada del diccionario (no al diccionario completo), es decir a una pareja (clave, valor).
Por ejemplo:
for (Map.Entry pareja: m.entrySet()) {System.out.println(pareja.getValue());
}


Definición de un HasMap e inserción, borrado y modificación de entradas  

Al declarar un diccionario hay que indicar los tipos tanto de la clave como del valor. En el siguiente ejemplo definimos el diccionario m que tendrá como clave un número entero y una cadena de caracteres como valor. Este diccionario se declara de esta forma:

HashMap<Integer, String> m = new HashMap<Integer, String>();

No hay que olvidar importar la clase al principio del programa:

import java.util.HashMap;
Para insertar una entrada en el diccionario se utiliza el método put indicando siempre la clave y el valor. Veamos un ejemplo completo.
 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import java.util.HashMap;
public class EjemploHashMap01 {
 public static void main(String[] args) {
  HashMap<Integer, String> m = new HashMap<Integer, String>();
  m.put(924, "Amalia Núñez");
  m.put(921, "Cindy Nero");
  m.put(700, "César Vázquez");
  m.put(219, "Víctor Tilla");
  m.put(537, "Alan Brito");
  m.put(605, "Esteban Quito ");
  System.out.println("Los elementos de m son: \n" + m);
 }
}

Para extraer valores se utiliza el método get. Se proporciona una clave y el diccionario nos devuelve el valor, igual que un diccionario de verdad. Si no existe ninguna entrada con la clave que se indica, se devuelve null.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public class EjemploHashMap011 {
 public static void main(String[] args) {
  HashMap<Integer, String> m = new HashMap<Integer, String>();
  m.put(924, "Amalia Núñez");
  m.put(921, "Cindy Nero");
  m.put(700, "César Vázquez");
  m.put(219, "Víctor Tilla");
  m.put(537, "Alan Brito");
  m.put(605, "Esteban Quito ");
  System.out.println(m.get(921));
  System.out.println(m.get(605));
  System.out.println(m.get(888));
 }
}
¿Y si queremos extraer todas las entradas? Tenemos varias opciones. Podemos usar el método print directamente sobre el diccionario de la forma System.out.print(diccionario) como vimos en un ejemplo anterior; de esta manera se muestran por pantalla todas las entradas encerradas entre llaves. También podemos convertir el diccionario en un entrySet (conjunto de entradas) y mostrarlo con print; de esta forma se obtiene una salida por pantalla muy parecida a la primera (en lugar de llaves se muestran corchetes). Otra opción es utilizar un for para recorrer una a una todas las entradas. En este último caso hay que convertir el diccionario en un entrySet ya que no se pueden sacar las entradas directamente del diccionario. Estas dos últimas opciones se ilustran en el siguiente ejemplo.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import java.util.HashMap;
import java.util.Map;
public class EjemploHashMap02 {
 public static void main(String[] args) {
  HashMap<Integer, String> m = new HashMap<Integer, String>();
  m.put(924, "Amalia Núñez");
  m.put(921, "Cindy Nero");
  m.put(700, "César Vázquez");
  m.put(219, "Víctor Tilla");
  m.put(537, "Alan Brito");
  m.put(605, "Esteban Quito ");
  System.out.println("Todas las entradas del diccionario extraídas con entrySet:");
  System.out.println(m.entrySet());
  System.out.println("\nEntradas del diccionario extraídas una a una:");
  for (Map.Entry pareja: m.entrySet()) {
   System.out.println(pareja);
  }
 }
}
A continuación se muestra el uso de los métodos getKey y getValue que extraen la clave y el valor de una entrada respectivamente.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import java.util.*;
public class EjemploHashMap03 {
 public static void main(String[] args) {
  HashMap<Integer, String> m = new HashMap<Integer, String>();
  m.put(924, "Amalia Núñez");
  m.put(921, "Cindy Nero");
  m.put(700, "César Vázquez");
  m.put(219, "Víctor Tilla");
  m.put(537, "Alan Brito");
  m.put(605, "Esteban Quito ");
  System.out.println("Código\tNombre\n------\t-------------");
  for (Map.Entry pareja: m.entrySet()) {
   System.out.print(pareja.getKey() + "\t");
   System.out.println(pareja.getValue());
  }
 }
}

En el último programa de ejemplo hacemos uso del método containsKey que nos servirá para saber si existe o no una determinada clave en un diccionario y del método get que, como ya hemos visto, sirve para extraer un valor a partir de su clave.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;
public class EjemploHashMap04 {
 public static void main(String[] args) {
  HashMap<Integer, String> m = new HashMap<Integer, String>();
  m.put(924, "Amalia Núñez");
  m.put(921, "Cindy Nero");
  m.put(700, "César Vázquez");
  m.put(219, "Víctor Tilla");
  m.put(537, "Alan Brito");
  m.put(605, "Esteban Quito ");
  System.out.print("Por favor, introduzca un código: ");
  int codigoIntroducido = Integer.parseInt(System.console().readLine());
  if (m.containsKey(codigoIntroducido)) {
   System.out.print("El código " + codigoIntroducido + " corresponde a ");
   System.out.println(m.get(codigoIntroducido));
  } else {
   System.out.print("El código introducido no existe.");
  }
 }
}

Ordenación de un ArrayList en java

Los elementos de una lista se pueden ordenar con el método sort. El formato es el siguiente:
Collections.sort(lista);

Observa que sort es un método de clase que está definido en Collections.
Para poder utilizar este método es necesario incluir la línea

import java.util.Collections;

al principio del programa. A continuación se muestra un ejemplo del uso de sort.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Collections;
import java.util.ArrayList;
public class EjemploArrayList071 {
 public static void main(String[] args) {
  ArrayList<Integer> a = new ArrayList<Integer>();
  a.add(67);
  a.add(78);
  a.add(10);
  a.add(4);
  System.out.println("\nNúmeros en el orden original:");
  for (int numero: a) {
   System.out.println(numero);
  }
  Collections.sort(a);
  System.out.println("\nNúmeros ordenados:");
  for (int numero: a) {
   System.out.println(numero);
  }
 }
}
También es posible ordenar una lista de objetos. En este caso es necesario indicar el criterio de ordenación en la definición de la clase. En el programa principal, se utiliza el método sort igual que si se tratase de una lista de números o de palabras como se muestra a continuación.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import java.util.Collections;
import java.util.ArrayList;
public class EjemploArrayList08 {
 public static void main(String[] args) {
  ArrayList<Gato> g = new ArrayList<Gato>();
  g.add(new Gato("Garfield", "naranja", "mestizo"));
  g.add(new Gato("Pepe", "gris", "angora"));
  g.add(new Gato("Mauri", "blanco", "manx"));
  g.add(new Gato("Ulises", "marrón", "persa"));
  g.add(new Gato("Adán", "negro", "angora"));
  Collections.sort(g);
  System.out.println("\nDatos de los gatos ordenados por nombre:");
  for (Gato gatoAux: g) {
   System.out.println(gatoAux+"\n");
  }
 }
}

Ahora bien, en la definición de la clase Gato hay que indicar de alguna manera cómo se debe realizar la ordenación, ya que Java no sabe de antemano si los gatos se ordenan según el color, el nombre, el peso, etc.
Lo primero que hay que hacer es indicar que los objetos de la clase Gato se pueden comparar unos con otros. Para ello, cambiamos la siguiente línea:
public class Gato por esta otra: public class Gato implements Comparable<Gato>

 Lo siguiente y no menos importante es definir el método compareTo. Este método debe devolver un 0 si los elementos que se comparan son iguales, un número negativo si el primer elemento que se compara es menor que el segundo y un número positivo en caso contrario. Afortunadamente, las clases String, Integer, Double, etc. ya tienen implementado su propio método compareTo así que tenemos hecho lo más difícil. Lo único que deberemos escribir en nuestro código es un compareTo con los atributos que queremos comparar.

En el caso que nos ocupa, si queremos ordenar los gatos por nombre, tendremos que implementar el compareTo de la clase Gato de tal forma que nos devuelva el resultado del compareTo de los nombres de los gatos que estamos comparando, de la siguiente manera:
public int compareTo(Gato g) {return (this.nombre).compareTo(g.getNombre());
}

Si en lugar de ordenar por nombre, quisiéramos ordenar por raza, el método compareTo de la clase Gato sería el siguiente:
public int compareTo(Gato g) {return (this.raza).compareTo(g.getRaza());
}

A continuación se muestra la definición completa de la clase Gato.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Gato implements Comparable<Gato> {
 private String nombre;
 private String color;
 private String raza;
 public Gato(String nombre, String color, String raza) {
  this.nombre = nombre;
  this.color = color;
  this.raza = raza;
 }
 public String getNombre() {
  return nombre;
 }
 public String getRaza() {
  return raza;
 }
 public String toString() {
  return "Nombre: " + this.nombre + "\nColor: " + this.color + "\nRaza: " + this.raza;
 }
 public int compareTo(Gato g) {
  return (this.nombre).compareTo(g.getNombre());
 }
 public boolean equals(Gato g) {
  return (this.nombre).equals(g.getNombre());
 }
}

ArrayList de objetos en java

Una colección ArrayList puede contener objetos que son instancias de clases definidas por el programador. Esto es muy útil sobre todo en aplicaciones de gestión para guardar datos de alumnos, productos, libros, etc.
 En el siguiente ejemplo, definimos una lista de gatos. En cada celda de la lista se almacenará un objeto de la clase Gato.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import java.util.ArrayList;
public class EjemploArrayList07 {
 public static void main(String[] args) {
  ArrayList<Gato> g = new ArrayList<Gato>();
  g.add(new Gato("Garfield", "naranja", "mestizo"));
  g.add(new Gato("Pepe", "gris", "angora"));
  g.add(new Gato("Mauri", "blanco", "manx"));
  g.add(new Gato("Ulises", "marrón", "persa"));
  System.out.println("\nDatos de los gatos:\n");
  for (Gato gatoAux: g) {
   System.out.println(gatoAux+"\n");
  }
 }
}
s

Colecciones: la clase ArrayList EJEMPLOS

Una colección en Java es una estructura de datos que permite almacenar muchos valores del mismo tipo; por tanto, conceptualmente es prácticamente igual que un array. Según el uso y según si se permiten o no repeticiones, Java dispone de un amplio catálogo de colecciones: ArrayList (lista), ArrayBlockingQueue (cola), HashSet (conjunto), Stack (pila), etc. En este manual estudiaremos la colección ArrayList. Un ArrayList es una estructura en forma de lista que permite almacenar elementos del mismo tipo (pueden ser incluso objetos); su tamaño va cambiando a medida que se añaden o se eliminan esos elementos. Nos podemos imaginar un ArrayList como un conjunto de celdas o cajoncitos donde se guardan los valores, exactamente igual que un array convencional. En la práctica será más fácil trabajar con un ArrayList. En capítulos anteriores hemos podido comprobar la utilidad del array; es un recurso imprescindible que cualquier programador debe manejar con soltura. No obstante, el array presenta algunos inconvenientes. Uno de ellos es la necesidad de conocer el tamaño exacto en el momento de su creación. Una colección, sin embargo, se crea sin que se tenga que especificar el tamaño; posteriormente se van añadiendo y quitando elementos a medida que se necesitan. Trabajando con arrays es frecuente cometer errores al utilizar los índices; por ejemplo al intentar guardar un elemento en una posición que no existe (índice fuera de rango). Aunque las colecciones permiten el uso de índices, no es necesario indicarlos siempre. Por ejemplo, en una colección del tipo ArrayList, cuando hay que añadir el elemento "Amapola", se puede hacer simplemente flores.add("Amapola"). Al no especificar índice, el elemento "Amapola" se añadiría justo al final de flores independientemente del tamaño y del número de elementos que se hayan introducido ya. La clase ArrayList es muy similar a la clase Vector. Ésta última está obsoleta y, por tanto, no se recomienda su uso.
Las operaciones más comunes que se pueden realizar con un objeto de la clase ArrayList son las siguientes:  
add(elemento) :
Añade un elemento al final de la lista.  


add(indice, elemento):
Inserta un elemento en una posición determinada,   desplazando el resto de elementos hacia la derecha.

clear():
  Elimina todos los elementos pero no borra la lista.
contains(elemento):
    Devuelve true si la lista contiene el elemento que se      especifica y false en caso contrario.

get(indice):
   Devuelve el elemento de la posición que se indica entre paréntesis. 
indexOf(elemento):
  Devuelve la posición de la primera ocurrencia del   elemento que se indica entre
paréntesis.
isEmpty():
  Devuelve true si la lista está vacía y false en caso de        tener algún elemento.
remove(indice):
Elimina el elemento que se encuentra en una posición determinada.
remove(elemento):
   Elimina la primera ocurrencia de un elemento. set(indice, elemento) Machaca el elemento que se encuentra en una determinada posición con el elemento que se pasa como parámetro.
size():
 Devuelve el tamaño (número de elementos) de la lista.
toArray():
 Devuelve un array con todos y cada uno de los elementos que contiene la lista.

Definición de un ArrayList e inserción, borrado y modificación de sus elementos






 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import java.util.ArrayList;
public class EjemploArrayList01 {
 public static void main(String[] args) {
  ArrayList<String> a = new ArrayList<String>();
  System.out.println("Nº de elementos: " + a.size());
  a.add("rojo");
  a.add("verde");
  a.add("azul");
  System.out.println("Nº de elementos: " + a.size());
  a.add("blanco");
  System.out.println("Nº de elementos: " + a.size());
  System.out.println("El elemento que hay en la posición 0 es " + a.get(0));
  System.out.println("El elemento que hay en la posición 3 es " + a.get(3));
 }
}

Observa que al crear un objeto de la clase ArrayList hay que indicar el tipo de dato que se almacenará en las celdas de esa lista. Para ello se utilizan los caracteres < y >. No hay que olvidar los paréntesis del final. 

Es necesario importar la clase ArrayList para poder crear objetos de esta clase, para ello debe aparecer al principio del programa la línea import java.util.ArrayList;. Algunos IDEs (por ej. Netbeans) insertan esta línea de código de forma automática. 



En el siguiente ejemplo se muestra un ArrayList de números enteros. 



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import java.util.ArrayList;
public class EjemploArrayList011 {
 public static void main(String[] args) {
  ArrayList<Integer> a = new ArrayList<Integer>();
  a.add(18);
  a.add(22);
  a.add(-30);
  System.out.println("Nº de elementos: " + a.size());
  System.out.println("El elemento que hay en la posición 1 es " + a.get(1));
 }
}

Se define la estructura de la siguiente manera:ArrayList<Integer> a = new ArrayList<Integer>();

Fíjate que no se utiliza el tipo simple int sino el wrapper Integer. Recuerda que los wrapper son clases que engloban a los tipos simples y les añaden nuevas funcionalidades (p. ej. permiten tratar a las variables numéricas como objetos). El wrapper de int es Integer, el de float es Float, el de double es Double, el de long es Long, el de boolean es Boolean y el de char es Character.
En el siguiente ejemplo podemos ver cómo extraer todos los elementos de una lista a la manera tradicional, con un bulce
for. 
 



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import java.util.ArrayList;
public class EjemploArrayList02 {
 public static void main(String[] args) {
  ArrayList<String> a = new ArrayList<String>();
  a.add("rojo");
  a.add("verde");
  a.add("azul");
  a.add("blanco");
  a.add("amarillo");
  System.out.println("Contenido de la lista: ");
  for(int i=0; i < a.size(); i++) {
   System.out.println(a.get(i));
  }
 }
}
Si estás acostumbrado al for clásico, habrás visto que es muy sencillo recorrer todos los elementos del ArrayList. No obstante, al trabajar con colecciones es recomendable usar el for al estilo foreach como se muestra en el siguiente ejemplo. Como puedes ver, la sintaxis es más corta y no se necesita crear un índice para recorrer la estructura.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import java.util.ArrayList;
public class EjemploArrayList03 {
 public static void main(String[] args) {
  ArrayList<String> a = new ArrayList<String>();
  a.add("rojo");
  a.add("verde");
  a.add("azul");
  a.add("blanco");
  a.add("amarillo");
  System.out.println("Contenido de la lista: ");
  for(String color: a) {
   System.out.println(color);
  }
 }
}
Fíjate en estas líneas:for(String color: a) { System.out.println(color);
}
El significado de este código sería el siguiente:for(String color: a)→ Saca uno a uno todos los elementos de a y ve metiéndolos en una variable de nombrecolor.System.out.println(color);→ Muestra por pantalla el contenido de la variable color. Veamos ahora en otro ejemplo cómo eliminar elementos de un ArrayList. Se utiliza el método remove() y se puede pasar como parámetro el índice del elemento que se quiere eliminar, o bien el valor del elemento. O sea, a.remove(2) elimina el elemento que se encuentra en la posición 2 de a mientras que a.remove("blanco") elimina el valor "blanco".


Es importante destacar que el
ArrayList se reestructura de forma automática después del borrado de cualquiera de sus elementos. 
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.ArrayList;
public class EjemploArrayList04 {
public static void main(String[] args) {
  ArrayList<String> a = new ArrayList<String>();
  a.add("rojo");
  a.add("verde");
  a.add("azul");
  a.add("blanco");
  a.add("amarillo");
  a.add("blanco");
  System.out.println("Contenido de la lista: ");
  for(String color: a) {
   System.out.println(color);
  }
  if (a.contains("blanco")) {
   System.out.println("El blanco está en la lista de colores");
  } a
  .remove("blanco");
  System.out.println("Contenido de la lista después de quitar la " +
  "primera ocurrencia del color blanco: ");
  for(String color: a) {
   System.out.println(color);
  } a
  .remove(2);
  System.out.println("Contenido de la lista después de quitar el " +
  "elemento de la posición 2: ");
  for(String color: a) {
   System.out.println(color);
  }
 }
}
A continuación se muestra un ejemplo en el que se “machaca” una posición del ArrayList. Al hacer a.set(2, "turquesa"), se borra lo que hubiera en la posición 2 y se coloca el valor "turquesa". Sería equivalente a hacer a[2] = "turquesa" en caso de que a fuese un array tradicional en lugar de un ArrayList.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import java.util.ArrayList;
public class EjemploArrayList05 {
 public static void main(String[] args) {
  ArrayList<String> a = new ArrayList<String>();
  a.add("rojo");
  a.add("verde");
  a.add("azul");
  a.add("blanco");
  a.add("amarillo");
  System.out.println("Contenido del vector: ");
  for(String color: a)
  System.out.println(color);
  a.set(2, "turquesa");
  System.out.println("Contenido del vector después de machacar la posición 2: ");
  for(String color: a) {
   System.out.println(color);
  }
 }
}
El método add permite añadir elementos a un ArrayList como ya hemos visto. Por ejemplo, a.add("amarillo") añade el elemento "amarillo" al final de a. Este método se puede utilizar también con un índice de la forma a.add(1, "turquesa"). En este caso, lo que se hace es insertar en la posción indicada. Lo mejor de todo es que el ArrayList se reestructura de forma automática desplazando el resto de elementos.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import java.util.ArrayList;
public class EjemploArrayList06 {
 public static void main(String[] args) {
  ArrayList<String> a = new ArrayList<String>();
  a.add("rojo");
  a.add("verde");
  a.add("azul");
  a.add("blanco");
  a.add("amarillo");
  System.out.println("Contenido de la lista: ");
  for(String color: a) {
   System.out.println(color);
  } 
  a.add(1, "turquesa");
  System.out.println("Contenido del vector después de insertar en la posición 1: ");
  for(String color: a) {
   System.out.println(color);
  }
 }
}