Estructuras básicas

Índice

ArrayList

https://classroom.github.com/assignment-invitations/32e19c107fce8d0750dbbae9e655dda7 Hemos visto en el tema de Arrays que éstos tienen un tamaño definido en el momento de la creación y que este tamaño es inmutable.

Si queremos usar este tipo de estructura pero que pueda cambiar el tamaño, usaremos ArrayList

1
2
import java.util.ArrayList; 
ArrayList<String> coches = new ArrayList<String>();

El método para añadir elementos es add

1
coches.add("Seat")

Para acceder al elemento iésimo get

1
coches.get(0);

Para conocer su tamaño, size

1
System.out.printf("Existen %d coches%n", coches.size());

Para eliminar el elemento iésimo, remove

1
coches.remove(0);

Para recorrerlo usamos un for each

1
2
3
for(String coche: coches){
	System.out.println(coche);
}

Si necesitamos ordenarlos,

1
2
3
4
import java.util.Collections;
...
Collections.sort(coches);
...

Si queremos comprobar si un dato ya está en la lista:

1
2
3
4
5
ArrayList<Integer> nums = new ArrayList<>();
nums.add(1);
nums.add(5);
System.out.println(nums.contains(1)); //true
System.out.println(nums.contains(3)); //false

Vamos a ver unos cuantos ejemplos.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// Java program to Demonstrate List Interface

// Importing all utility classes
import java.util.*;

// Main class
// ListDemo class
class GFG {

	// Main driver method
	public static void main(String[] args)
	{
        //Crear un objeto de la interface List
        //Implementado por la clase ArrayList
		List<Integer> l1 = new ArrayList<Integer>();

		// Añadir elementos
		l1.add(0, 1);
		l1.add(1, 2);

		// Imprimir los elementos del array
		System.out.println(l1);

		List<Integer> l2 = new ArrayList<Integer>();

		l2.add(1);
		l2.add(2);
		l2.add(3);

        //Añadirá todos los elementos de l2 a partir del índice 1
		l1.addAll(1, l2);

		System.out.println(l1);

		// Elimina el elemento 1 del array
		l1.remove(1);

		System.out.println(l1);

		// Imprime el elemento en la posición 3 mediante get
		System.out.println(l1.get(3));

        //Reemplaza el elemento 0 por el número 5
		l1.set(0, 5);

		// Again printing the updated List 1
		System.out.println(l1);
	}
}

Salida

1
2
3
4
5
[1, 2]
[1, 1, 2, 3, 2]
[1, 2, 3, 2]
2
[5, 2, 3, 2]

Añadir 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
// Java Program to Add Elements to a List

// Importing all utility classes
import java.util.*;

// Main class
class GFG {

	// Main driver method
	public static void main(String args[])
	{
		// Creating an object of List interface,
		// implemented by ArrayList class
		List<String> al = new ArrayList<>();

		// Adding elements to object of List interface
		// Custom elements
		al.add("Geeks");
		al.add("Geeks");
		al.add(1, "For");

		// Print all the elements inside the
		// List interface object
		System.out.println(al);
	}
}

Salida

1
[Geeks, For, Geeks]

Actualizar 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
// Java Program to Update Elements in a List

// Importing utility classes
import java.util.*;

// Main class
class GFG {

	// Main driver method
	public static void main(String args[])
	{
		// Creating an object of List interface
		List<String> al = new ArrayList<>();

		// Adding elements to object of List class
		al.add("Geeks");
		al.add("Geeks");
		al.add(1, "Geeks");

		// Display theinitial elements in List
		System.out.println("Initial ArrayList " + al);

		// Setting (updating) element at 1st index
		// using set() method
		al.set(1, "For");

		// Print and display the updated List
		System.out.println("Updated ArrayList " + al);
	}
}
1
2
Initial ArrayList [Geeks, Geeks, Geeks]
Updated ArrayList [Geeks, For, Geeks]

Eliminar elementos

Para eliminar un elemento de una lista, podemos usar el método remove(). Este método está sobrecargado para realizar múltiples operaciones basadas en diferentes parámetros.

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
32
33
34
35
36
37
38
39
40
41
42
43
// Java Program to Remove Elements from a List

// Importing List and ArrayList classes
// from java.util package
import java.util.ArrayList;
import java.util.List;

// Main class
class GFG {

	// Main driver method
	public static void main(String args[])
	{

		// Creating List class object
		List<String> al = new ArrayList<>();

		// Adding elements to the object
		// Custom inputs
		al.add("Geeks");
		al.add("Geeks");

		// Adding For at 1st indexes
		al.add(1, "For");

		// Print the initialArrayList
		System.out.println("Initial ArrayList " + al);

		// Now remove element from the above list
		// present at 1st index
		al.remove(1);

		// Print the List after removal of element
		System.out.println("After the Index Removal " + al);

		// Now remove the current object from the updated
		// List
		al.remove("Geeks");

		// Finally print the updated List now
		System.out.println("After the Object Removal " + al);
	}
}

Salida

1
2
3
Initial ArrayList [Geeks, For, Geeks]
After the Index Removal [Geeks, Geeks]
After the Object Removal [Geeks]

Iterar por una lista

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
32
33
34
35
36
37
38
39
40
41
42
// Java program to Iterate the Elements
// in an ArrayList

// Importing java utility classes
import java.util.*;

// Main class
public class GFG {

	// main driver method
	public static void main(String args[])
	{
		// Creating an empty Arraylist of string type
		List<String> al = new ArrayList<>();

		// Adding elements to above object of ArrayList
		al.add("Geeks");
		al.add("Geeks");

		// Adding element at specified position
		// inside list object
		al.add(1, "For");

		// Using for loop for iteration
		for (int i = 0; i < al.size(); i++) {

			// Using get() method to
			// access particular element
			System.out.print(al.get(i) + " ");
		}

		// New line for better readability
		System.out.println();

		// Using for-each loop for iteration
		for (String str : al)

			// Printing all the elements
			// which was inside object
			System.out.print(str + " ");
	}
}

Salida

1
2
Geeks For Geeks
Geeks For Geeks
Método Descripción
add(int index, Object element) Este método se utiliza para insertar un elemento específico en un índice de posición específico en una lista.
add(Object o) Este método se usa para agregar un elemento específico al final de una lista.
addAll(Collection C) Este método se usa para agregar todos los elementos de una colección específica al final de la lista mencionada.
addAll(int index, Collection C) Se utiliza para insertar todos los elementos que comienzan en la posición especificada de una colección específica en la lista mencionada.
clear() Este método se utiliza para eliminar todos los elementos de cualquier lista.
contains(Object o) Devuelve verdadero si esta lista contiene el elemento especificado.
forEach(Consumer action) Realiza la acción dada para cada elemento del iterable hasta que se hayan procesado todos los elementos o la acción genere una excepción.
get(int index) Devuelve el elemento en la posición especificada en esta lista.
indexOf(Object O) Se devuelve el índice de la primera aparición de un elemento específico, o -1 en caso de que el elemento no esté en la lista.
isEmpty() Devuelve verdadero si esta lista no contiene elementos.
lastIndexOf(Object O) Se devuelve el índice de la última aparición de un elemento específico o -1 en caso de que el elemento no esté en la lista.
listIterator() Devuelve un iterador de lista sobre los elementos de esta lista (en la secuencia adecuada).
listIterator(int index) Devuelve un iterador de lista sobre los elementos de esta lista (en la secuencia adecuada), comenzando en la posición especificada en la lista.
remove(int index) Elimina el elemento en la posición especificada en esta lista.
remove(Object o) Elimina la primera aparición del elemento especificado de esta lista, si está presente.
removeAll(Collection c) Elimina de esta lista todos sus elementos que están contenidos en la colección especificada.
removeIf(Predicate filter) Elimina todos los elementos de esta colección que satisfacen el predicado dado.
removeRange(int fromIndex, int toIndex) Elimina de esta lista todos los elementos cuyo índice se encuentra entre fromIndex, inclusive, y toIndex, exclusivo.
retainAll(Collection c) Conserva solo los elementos de esta lista que están contenidos en la colección especificada.
set(int index, E element) Reemplaza el elemento en la posición especificada en esta lista con el elemento especificado.
size() Devuelve el número de elementos de esta lista.
subList(int fromIndex, int toIndex) Devuelve una vista de la parte de esta lista entre fromIndex, inclusive, y toIndex, exclusivo.
toArray() Este método se utiliza para devolver una matriz que contiene todos los elementos de la lista en el orden correcto.
toArray(Object O) También se usa para devolver una matriz que contiene todos los elementos de esta lista en el orden correcto, igual que el método anterior.

Fuente https://www.geeksforgeeks.org/list-interface-java-examples/

Ejercicio Coches (F)

(ra3.b, ra3.f, ra5.c, ra6.b, ra6.e, ra6.c)

Realiza un programa que permita al usuario añadir marcas de coches mediante la consola. Si escribe una línea en blanco, se acabará de añadir marcas.

Al final debe imprimirlas ordenadas en líneas separadas

Ejercicio Altura (M)

(ra3.b, ra3.f, ra5.c, ra6.b, ra6.e, ra6.c)

Programa Java que pida por teclado las alturas de N alumnos de una clase y las guarde en un ArrayList de tipo Double.

A continuación el programa calculará la altura media de todos los alumnos, cuántos alumnos hay más altos que la media y cuantos más bajos. Para resolverlo vamos a utilizar 6 métodos además del método main:

  • Método numeroAlumnos(): este método pide por teclado el número de alumnos de la clase y devuelve dicho número al programa principal.
  • Método leerAlturas(): pide por teclado las alturas de los N alumnos y las almacena en el ArrayList. Este método recibe como parámetros el ArrayList inicialmente vacío y el número de alumnos a leer.
  • Método calcularMedia(): calcula y devuelve la media de los alumnos de la clase. Este método recibe como parámetro el ArrayList con las alturas de todos los alumnos.
  • Método calcularAlumnosAlturaSuperior: Este método recibe como parámetro el ArrayList con las alturas de todos los alumnos y devuelve el número de alumnos con una altura superior a la media
  • Método calcularAlumnosAlturaInferior: Este método recibe como parámetro el ArrayList con las alturas de todos los alumnos y devuelve el número de alumnos con una altura inferior a la media
  • Método mostrarResultados(): muestra por pantalla todas las alturas y calcula y muestra el número de alumnos con altura superior e inferior a la media. Recibe como parámetros el ArrayList con las alturas de todos los alumnos y la media calculada anteriormente.

Repartiendo regalos en tu calle (D)

(ra3.b, ra3.f, ra5.c, ra6.b, ra6.e, ra6.c)

Papá Noel quiere repartir juguetes a todos los niños de la mejor calle del mundo: la tuya. Para ello, consulta una lista de los portales de esa calle en los que debe dejar regalos.

La forma en la que reparte los regalos es peculiar. Aterriza con su trineo en un portal determinado (que no tiene por qué ser uno en los que tiene que dar regalos), y luego sigue las siguientes reglas:

  • Reparte los regalos al portal que tiene más cerca de su posición actual.
  • La distancia entre dos portales es el valor absoluto de su resta. Es decir, la distancia entre el portal 10 y el portal 8 es 2 (10 − 8 = 2), lo mismo que la distancia entre el portal 8 y el portal 10 (valor absoluto de 8 − 10).
  • Si dos portales están a igual distancia, siempre va hacia el que tiene el número más grande.

¿Cuál es el orden en el que visita los portales?

La entrada constará de 2 parámetros: el número de portal en el que aterriza y una lista con todos los portales que ha de visitar.

Por ejemplo, 0, 2, 4 Indica que aterriza en el portal 0 y tiene que repartir al 2 y al 4.

Y la salida será

1
2, 4

3, 2, 5, 1 cuya salida será

1
2 1 5

y 3, 2, 4, 7 cuya salida será

1
4 2 7

Fuente https://www.aceptaelreto.com/problem/statement.php?id=367

HashMap, TreeMap y LinkedHashMap

Esta clases: HashMap, TreeMap y LinkedHashMap nos permite almacenar elementos asociando a cada clave un valor.

Para cada clave tenemos un valor asociado. Podemos después buscar fácilmente un valor para una determinada clave.

Algunos ejemplos donde podríamos usar un Mapa:

  • Guardar en la clave un País y en el valor su Capital
  • Crear una lista con NIA`s de alumnos y sus nombres

Ejemplo

Almacenar un diccionario las palabras en castellano como ‘clave’ y las traducciones de las mismas en el ‘valor’.

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
32
import java.util.HashMap;
import java.util.Map;

public class PruebaHashMap {
    public static void main(String[] args) {
        Map<String, String> mapa1 = new HashMap<String, String>();
        mapa1.put("rojo", "red");
        mapa1.put("verde", "green");
        mapa1.put("azul", "blue");
        mapa1.put("blanco", "white");

        System.out.println("Listado completo de valores");
        for (String valor : mapa1.values())
            System.out.print(valor + "-");
        System.out.println();

        System.out.println("Listado completo de claves");
        for (String clave : mapa1.keySet())
            System.out.print(clave + "-");
        System.out.println();

        System.out.println("La traducción de 'rojo' es:" + mapa1.get("rojo"));

        if (!mapa1.containsKey("negro"))
            System.out.println("No existe la clave 'negro'");

        System.out.println("La traducción de 'marron' es:" + mapa1.getOrDefault("marrón", "No existe la clave marrón"));

        mapa1.remove("rojo");
        System.out.println(mapa1);
    }
}

La clase HashMap debe implementar la interfaz Map, así que se declara como;

1
Map<String, String> mapa1 = new HashMap<String, String>();

La clase HashMap utiliza datos genéricos tanto para la clave como para el valor, en este ejemplo la clave y el valor son datos de tipo String.

Mediante el método put agregamos un elemento a la colección de tipo HashMap:

1
2
3
4
mapa1.put("rojo", "red");
mapa1.put("verde", "green");
mapa1.put("azul", "blue");
mapa1.put("blanco", "white");

Para imprimir todos los valores del mapa lo recorremos mediante un for-each:

1
2
for (String valor : mapa1.values())
	System.out.print(valor + "-");

De forma similar si queremos recorrer todas las claves del mapa:

1
2
for (String clave : mapa1.keySet())
    System.out.print(clave + "-");

Para recuperar un valor para una determinada clave llamamos al método get y le pasamos la clave a buscar, si dicha clave no existe en el mapa se nos retorna el valor null:

1
System.out.println("La traducción de 'rojo' es:" + mapa1.get("rojo"));

Si queremos verificar si una determinada clave existe en el mapa lo hacemos mediante el método containsKey:

1
2
if (mapa1.containsKey("negro"))
    System.out.println("No existe la clave 'negro'");

Una variante del método get es getOrDefault que nos retorna el segundo parámetro si no encuentra la clave en el mapa:

1
2
System.out.println("La traducción de 'marron' es:" +
                   mapa1.getOrDefault("marrón", "No existe la clave marrón"));

Para eliminar un elemento de la colección debemos hacer uso del método remove, pasamos una clave del mapa:

1
mapa1.remove("rojo");

Para imprimir el mapa completo en la Consola podemos hacer uso del método println:

1
System.out.println(mapa1);

Hemos utilizado la clase HashMap para resolver el problema. La clase TreeMap es idéntica a HashMap con la salvedad que mantiene ordenado los datos por la clave.

Finalmente la clase LinkedHashMap mantiene ordenado los elementos del mapa según el orden de inserción.

Ejercicio PaisCapital.java (F)

(ra3.b, ra3.f, ra5.c, ra6.b, ra6.e, ra6.c)

Declara un HashMap que almacene el país y la capital de varios países Europeos. Luego realiza un programa que pida un País al usuario y muestre su capital.

Teléfonos (F)

(ra3.b, ra3.f, ra5.c, ra6.b, ra6.e, ra6.c)

Queremos tener un guía de teléfonos que asocie un número de teléfono a un contacto. El programa debe pedir un contacto y mostrar su número asociado

Teléfonos II (F)

(ra3.b, ra3.f, ra5.c, ra6.b, ra6.e, ra6.c)

Se trata de implementar el ejercicio anterior pero un contacto puede tener más de un teléfono:

Pista

Utiliza un ArrayList como valor para poder almacenar más de un teléfono

1
2
HashMap<String, ArrayList<String>> agenda = new HashMap<>();

Ahora para añadir los teléfonos de Pepe

1
2
3
4
5
6
7
8
9
10
ArrayList<String> telefonos = new ArrayList<>();
telefonos.add("667761");
telefonos.add("+0034 44001");
agenda.put("Pepe", telefonos);
// Para empezar a dar de alta los números del siguiente contacto es necesario usar
// new ArrayList<>() pues de lo contrario la lista sería compartida por todos!
telefonos = new ArrayList<>();
telefonos.add("94884");
telefonos.add("34535");
agenda.put("Juan", telefonos);

Para comprobar que debemos usar new ArrayList<>(); comenta dicha línea e inspecciona el valor de los teléfonos de Pepe o Juan. Comprobarás que los dos tienen los mismos teléfonos

image-20231212083247483

La mejor terminación (M)

(ra3.b, ra3.f, ra5.c, ra6.b, ra6.e, ra6.c)

En los sorteos de la lotería más mediáticos, como el del Gordo de Navidad o el del Niño, es habitual que los fetichistas busquen números con algún tipo de significado extraño o que los matemáticos y estadísticos se entretengan informando sobre los números más habituales.

Esto último es interesante si queremos maximizar la probabilidad de ganar algo. Dado que los números que terminan con el mismo dígito que el del premio principal tienen un reintegro, una buena forma de intentar, al menos, no perder dinero es jugar un número con la terminación más habitual en el histórico de sorteos.

Siendo puristas, la probabilidad de que salga un número es independiente de lo que haya ocurrido en años anteriores. Pero es tan tentador ignorar esto que no puedes resistirte.

La entrada consistirá en un array con varios boletos de lotería y la salida será cuántas veces se repite una terminación (sólo el último dígito).

Por ejemplo, "00004", "03847", "39804"

1
{4=2, 7=1}

O, "58975", "25894", "52985", "98598"

1
{4=1, 5=2, 8=1}

-

Fuente https://www.aceptaelreto.com/problem/statement.php?id=387

Ejercicio Botín (M)

(ra3.b, ra3.f, ra5.c, ra6.b, ra6.e, ra6.c)

Al-Colleja y sus secuaces tienen que repartir el botín de su último golpe. No es una tarea fácil, porque todos quieren llevarse lo máximo posible, y todos están armados…

Para no entrar en discusiones que terminen en tragedia, Al-Colleja ha ideado un sencillo método en el que, en lugar de preocuparse de ser justos repartiendo en base a quién ha trabajado más en la consecución del golpe, se lo deja prácticamente todo al azar. Prefiere recibir menos beneficios pero mantener la banda intacta.

El procedimiento es sencillo. Coge todos los billetes conseguidos y los pone en un montón tras barajarlos. Después se coloca toda la banda en círculo y va dando un billete a cada uno, hasta que quedan todos repartidos. Eso sí, el primero que recibe billete es él, de esa forma se asegura de que si los billetes se terminan a mitad de una vuelta, él siempre habrá recibido uno adicional.

El componente de azar aparece porque los billetes están descolocados, así que puede tocar en el reparto desde el mísero billete de 10 hasta el deseado de 500…

La entrada constará de 2 partes: la primera es el número e participantes en el golpe y la segunda un array con los billetes a repartir.

Por ejemplo: 2, 10, 20, 50, 200, 500 que producirá como salida

1
{0=10 50 500, 1=20 200} //esta es la salida usando toString. Debes devolver el Mapa

O 3, 50, 20, 100, 200, 500, 10, 50

que resultará en

1
{0=50 200 50, 1=20 500, 2=100  10} //esta es la salida usando toString. Debes devolver el Mapa

Pista

La única dificultad de este ejercicio es hacer que la ronda de reparto sea circular. Es decir, que cuando llegue al último comience por el primero.

Acuérdate de cómo hicimos el ejercicio del DNI

Fuente

https://www.aceptaelreto.com/problem/statement.php?id=238

Ejercicio Frequency (F)

(ra3.b, ra3.f, ra5.c, ra6.b, ra6.e, ra6.c)

Se trata de pedir por pantalla una serie de palabras y calcular la frecuencia de cada una de ellas, es decir, las veces que se repiten. Para finalizar el programa se debe introducir una línea en blanco Por ejemplo:

1
uno dos dos tres tres tres

Daría como resultado:

1
2
3
uno - 1
dos - 2
tres - 3

Ejercicio Anagramas (M)

(ra3.b, ra3.f, ra5.c, ra5.d, ra6.b, ra6.e, ra6.c)

Un anagrama es un grupo de palabras que contienen las mismas letras pero en diferente orden:

Por ejemplo: alma, mala

El ejercicio consiste en leer todas las líneas de un fichero. Por cada palabra que encuentra crea una entrada en el mapa con la palabra alfabetizada con las letras en orden alfabético como clave. Siguiendo el ejemplo, aalm

Y en el valor crea un ArrayList con todas las palabras con las mismas letras.

Es decir, la clave aalm tendrá una lista con dos valores: alma y mala.

Después se pide un número (minGroupSize) que es el mínimo número de valores para que salga impreso por pantalla

Para leer un archivo línea a línea, usa el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.io.*;
import java.util.*;

public class Anagramas {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("path-to-file"));
	    String line;
	    while ((line = reader.readLine())!=null) {
	        //Trabajar con line
	    }
	    reader.close();
    }
}

Para ordenar una cadena por orden alfabético, usa el siguiente código;

1
2
3
4
5
   private static String alphabetize(String s) {
        char[] a = s.toCharArray();
        Arrays.sort(a);
        return new String(a);
    }

Ejemplo CountCountries (M)

(ra3.b, ra3.f, ra5.c, ra5.d, ra6.b, ra6.e, ra6.c)

En el siguiente ejercicio partimos de un fichero csv que almacena los datos de los alumnos, incluido el país de origen que se almacena en el campo 7 de dicho archivo.

Se trata de contar cuántos alumnos pertenecen a cada país.

Luego el programa deberá mostrar la cantidad de alumnos de un país pasado como parámetro:

Acuérdate que en algún ejercicio hemos dividido un array en palabras. Ahora se trata de dividirlo por la ,

Para sumar 1 a la lista de países;

1
2
3
//Cogemos el campo 7 de la línea. 
// Si no está esa clave, la ponemos, la inicializamos a 0 y luego sumamos 1
map.put(splittedLine[6], map.getOrDefault(splittedLine[6] , 0) + 1);

HashSet

Es una colección desordenada de objetos en la que no pueden existir duplicados.

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
// Java program Illustrating Set Interface

// Importing utility classes
import java.util.*;

// Main class
public class HashSet1 {

	// Main driver method
	public static void main(String[] args)
	{
		// Demonstrating Set using HashSet
		// Declaring object of type String
		Set<String> hash_Set = new HashSet<String>();

		// Adding elements to the Set
		// using add() method
		hash_Set.add("Geeks");
		hash_Set.add("For");
		hash_Set.add("Geeks");
		hash_Set.add("Example");
		hash_Set.add("Set");

		// Printing elements of HashSet object
		System.out.println(hash_Set);
	}
}

Salida

1
[Set, Example, Geeks, For]

Ejemplo de unión, intersección y diferencia de HashSet

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Java Program Demonstrating Operations on the Set
// such as Union, Intersection and Difference operations

// Importing all utility classes
import java.util.*;

// Main class
public class SetExample {

	// Main driver method
	public static void main(String args[])
	{
		// Creating an object of Set class
		// Declaring object of Integer type
		Set<Integer> a = new HashSet<Integer>();

		// Adding all elements to List
		a.addAll(Arrays.asList(
			new Integer[] { 1, 3, 2, 4, 8, 9, 0 }));

	// Again declaring object of Set class
	// with reference to HashSet
		Set<Integer> b = new HashSet<Integer>();

	b.addAll(Arrays.asList(
			new Integer[] { 1, 3, 7, 5, 4, 0, 7, 5 }));


		// To find union
		Set<Integer> union = new HashSet<Integer>(a);
		union.addAll(b);
		System.out.print("Union of the two Set");
		System.out.println(union);

		// To find intersection
		Set<Integer> intersection = new HashSet<Integer>(a);
		intersection.retainAll(b);
		System.out.print("Intersection of the two Set");
		System.out.println(intersection);

		// To find the symmetric difference
		Set<Integer> difference = new HashSet<Integer>(a);
		difference.removeAll(b);
		System.out.print("Difference of the two Set");
		System.out.println(difference);
	}
}

Salida

1
2
3
Union of the two Set[0, 1, 2, 3, 4, 5, 7, 8, 9]
Intersection of the two Set[0, 1, 3, 4]
Difference of the two Set[2, 8, 9]

Pilas

El marco de Java Collection proporciona una clase Stack que modela e implementa una estructura de datos de tipo pila. La clase se basa en el principio básico de último en entrar, primero en salir.

Stack es una estructura de datos lineal que sigue un orden particular en el que se realizan las operaciones. El orden puede ser LIFO (Last In First Out) o FILO (First In Last Out).

El siguiente diagrama muestra la jerarquía de la clase Stack:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Java code for stack implementation

import java.io.*;
import java.util.*;

class Test
{
	// Pushing element on the top of the stack
	static void stack_push(Stack<Integer> stack)
	{
		for(int i = 0; i < 5; i++)
		{
			stack.push(i);
		}
	}

	// Popping element from the top of the stack
	static void stack_pop(Stack<Integer> stack)
	{
		System.out.println("Pop Operation:");

		for(int i = 0; i < 5; i++)
		{
			Integer y = (Integer) stack.pop();
			System.out.println(y);
		}
	}

	// Displaying element on the top of the stack
	static void stack_peek(Stack<Integer> stack)
	{
		Integer element = (Integer) stack.peek();
		System.out.println("Element on stack top: " + element);
	}

	// Searching element in the stack
	static void stack_search(Stack<Integer> stack, int element)
	{
		Integer pos = (Integer) stack.search(element);

		if(pos == -1)
			System.out.println("Element not found");
		else
			System.out.println("Element is found at position: " + pos);
	}


	public static void main (String[] args)
	{
		Stack<Integer> stack = new Stack<Integer>();

		stack_push(stack);
		stack_pop(stack);
		stack_push(stack);
		stack_peek(stack);
		stack_search(stack, 2);
		stack_search(stack, 6);
	}
}

Salida

1
2
3
4
5
6
7
8
9
Pop Operation:
4
3
2
1
0
Element on stack top: 4
Element is found at position: 3
Element not found

Añadir 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
32
// Java program to add the
// elements in the stack
import java.io.*;
import java.util.*;

class StackDemo {

	// Main Method
	public static void main(String[] args)
	{

		// Default initialization of Stack
		Stack stack1 = new Stack();

		// Initialization of Stack
		// using Generics
		Stack<String> stack2 = new Stack<String>();

		// pushing the elements
		stack1.push(4);
		stack1.push("All");
		stack1.push("Geeks");

		stack2.push("Geeks");
		stack2.push("For");
		stack2.push("Geeks");

		// Printing the Stack Elements
		System.out.println(stack1);
		System.out.println(stack2);
	}
}
1
2
[4, All, Geeks]
[Geeks, For, Geeks]

Acceder a un elemento

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
// Java program to demonstrate the accessing
// of the elements from the stack
import java.util.*;
import java.io.*;

public class StackDemo {

	// Main Method
	public static void main(String args[])
	{
		// Creating an empty Stack
		Stack<String> stack = new Stack<String>();

		// Use push() to add elements into the Stack
		stack.push("Welcome");
		stack.push("To");
		stack.push("Geeks");
		stack.push("For");
		stack.push("Geeks");

		// Displaying the Stack
		System.out.println("Initial Stack: " + stack);

		// Fetching the element at the head of the Stack
		System.out.println("The element at the top of the"
						+ " stack is: " + stack.peek());

		// Displaying the Stack after the Operation
		System.out.println("Final Stack: " + stack);
	}
}

Salida

1
2
3
Initial Stack: [Welcome, To, Geeks, For, Geeks]
The element at the top of the stack is: Geeks
Final Stack: [Welcome, To, Geeks, For, Geeks]

Eliminar 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
32
// Java program to demonstrate the removing
// of the elements from the stack
import java.util.*;
import java.io.*;

public class StackDemo {
	public static void main(String args[])
	{
		// Creating an empty Stack
		Stack<Integer> stack = new Stack<Integer>();

		// Use add() method to add elements
		stack.push(10);
		stack.push(15);
		stack.push(30);
		stack.push(20);
		stack.push(5);

		// Displaying the Stack
		System.out.println("Initial Stack: " + stack);

		// Removing elements using pop() method
		System.out.println("Popped element: "
						+ stack.pop());
		System.out.println("Popped element: "
						+ stack.pop());

		// Displaying the Stack after pop operation
		System.out.println("Stack after pop operation "
						+ stack);
	}
}

Salida

1
2
3
4
Initial Stack: [10, 15, 30, 20, 5]
Popped element: 5
Popped element: 20
Stack after pop operation [10, 15, 30]

Ejercicios

Realiza los siguientes ejercicios:

  • Paréntesis. (M)

    Pista

    • Cuando encuentres un símbolo de apertura, añádelo a la pila
    • Cuando sea de cierre, saca uno de la pila y comprueba si es el correspondiente. En caso contrario está mal
  • Expresiones aritméticas (M)

    Pista

    • ve apilando los operandos
    • Cuando encuentres un operador, saca dos operandos y aplícale el operador

Adaptado del siguiente material