Saltar a contenido

Conjuntos (Set)

La interfaz Set está contenida en el paquete java.util y extiende de la interfaz Collection, es una colección desordenada de objetos en los que no se pueden almacenar valores duplicados. Esta interfaz contiene los métodos heredados de la interfaz Collection y agrega una función que restringe la inserción de elementos duplicados.

La interfaz Set define los métodos básicos de añadir, eliminar, comprobar tamaño, si está vacío, también podemos verificar si un elemento existe en el conjunto. Pero no hay forma de obtener un elemento del conjunto. Es decir, podemos comprobar que algo existe y podemos iterar sobre los elementos del conjunto, pero no es posible obtener, por ejemplo, el elemento 3 del conjunto.

Dado que Set es una interfaz, debe instanciar una implementación concreta de la interfaz para poder usarla. Puedes elegir entre las siguientes implementaciones de Set en la API de colecciones de Java: java.util.HashSet, java.util.TreeSet y java.util.LinkedHashSet.

Una de las mejores implementaciones (con mejor rendimiento) de la interfaz Set es la clase HashSet, que utiliza tablas hashes para almacenar los elementos. Es muy parecido a la clase HashMap que hemos utilizado anteriormente.

//Sets genéricos sin especificar el tipo
Set setA = new HashSet();
Set setB = new LinkedHashSet();
Set setC = new TreeSet();
//Set de tipo Integer
Set<Integer> set = new HashSet<Integer> ();
//Añadir elementos en un Set
Set<String> setA = new HashSet<>();
setA.add("element 1");
setA.add("element 2");
setA.add("element 3");

Hay dos formas de iterar los elementos de un Java Set:

  • Utilizando un Iterator obtenido de la interfaz Set.
  • Usando un bucle for-each.

Al iterar los elementos en el Set, el orden de los elementos depende de la implementación que utilicemos para crear el Set.

//Con Iterator
Set<String> setA = new HashSet<>();
setA.add("element 1");
setA.add("element 2");
setA.add("element 3");
Iterator iterator = set.iterator();
while(iterator.hasNext(){
    String element = iterator.next();
}
//Con bucle for-each
Set<Integer> set= new HashSet();
for(Integer num: set) {
    System.out.println(num);
}
//Si me he creado un set genérico, tengo que hacer un cast del objeto:
Set set = new HashSet();
for(Object object : set) {
    String element = (String) object;
}

Se puede convertir los elementos de un Set en una List. Para ello, llamamos al método addAll(), pasando el conjunto como parámetro.

Set<String> set = new HashSet<>();
set.add("123");
set.add("456");
List<String> list = new ArrayList<>();
list.addAll(set);

Además de estos ejemplos, hay más funciones en la documentación oficial.

Actividades

  • AC 907 (RA6 / CE6a CE6b CE6c CE6d CE6e CE6f CE6g / IC1 / 3p). Insertar en una lista 20 enteros aleatorios entre 1 y 10. A partir de ella, crear un conjunto con los elementos de la lista sin repetir, otro con los repetidos y otro con los elementos que aparecen una sola vez en la lista original.

  • PR 908 (RA6 / CE6a CE6b CE6c CE6d CE6e CE6f CE6g / IC2 / 5p). En la biblioteca municipal, además de los préstamos de libros, hay gente que va a leer, estudiar o hacer tareas, y es común que cojan libros, revistas, películas... de las estanterías para utilizarlos en la propia biblioteca sin llevarlos a su casa. Queremos implementar un sistema de devolución rápida de estos materiales para poder colocarlos en su sitio.

    Los usuarios de la biblioteca, cuando han terminado de utilizar cualquier material, lo llevan a la mesa de devolución rápida y lo colocan en el montón. Pueden dejar varios elementos a la vez.

    Al finalizar su turno, el bibliotecario, coge los elementos del montón de uno en uno y los lleva a su lugar correspondiente. Realiza un programa en Java utilizando las colecciones más adecuadas para que los usuarios puedan hacer la devolución rápida en el montón y el bibliotecario pueda volver a colocar cada cosa en su lugar.

    Ayuda

    Puedes suponer 10 usuarios que devuelven entre 1 y 3 elementos.

    Se debe mostrar:

    • a) Los elementos que tiene un usuario
    • b) Los elementos que hay en el montón de devolución después de que cada usuario haga la devolución.
    • c) La colocación de los elementos en su lugar por parte del bibliotecario.

    Se han de controlar todas las excepciones que consideres así como usar expresiones regulares si lo consideras pertinente.

  • PR 909 (RA6 / CE6a CE6b CE6c CE6d CE6e CE6f CE6g / IC2 / 5p). La pescadería Loli está buscando optimizar su proceso de atención al cliente para reducir los tiempos de espera y mejorar la eficiencia del servicio. Para ello ha puesto una máquina que da los turnos.

    Cuando un cliente llega a la pescadería toma un turno y espera a que Loli le atienda. Loli tarda un tiempo aleatorio entre 5 o 15 minutos en atender a un cliente. Los clientes llegan de uno en uno separados un tiempo de entre 2 y 5 minutos aleatoriamente. Es posible que un cliente llegue, vea que hay demasiada gente, y se vaya.

    Crea un programa en Java que permita gestionar los turnos en la Pescadería Loli utilizando las colecciones más adecuadas.

    Ayuda

    Puedes suponer un total de 20 clientes en la pescadería.

    Se debe mostrar:

    • a) Un mensaje cada vez que llega un usuario y tomar su turno.
    • b) La cantidad de personas que esperan cada vez que se modifica.
    • c) Un mensaje cada vez que Loli termina de atender a alguien y llama al siguiente cliente.
    • d) Un mensaje cada vez que alguien decide no quedarse a esperar y se va.

    Se han de controlar todas las excepciones que consideres así como usar expresiones regulares si lo consideras pertinente.

  • PR 910 (RA6 / CE6a CE6b CE6c CE6d CE6e CE6f CE6g / IC2 / 5p). Un estudiante de 1º de DAW acaba de comenzar su colección de cromos de “Programadores Locos y sus Locos Lenguajes de Programación” que consta de 250 cromos diferentes de dos categorías: programadores y lenguajes de programación.

    Para ello ha comprado 10 sobres con 5 cromos cada uno. Los cromos de los sobres están colocados aleatoriamente, pudiendo incluso estar repetidos. El estudiante, tiene los cromos completamente ordenados en un álbum con un lugar específico para cada uno de ellos.

    Además los cromos repetidos los lleva en un mazo a clase para intercambiar con sus compañeros.

    Crea un programa en Java, utilizando las colecciones que consideres oportunas, que permita que gestionar los cromos del estudiante, tanto los ordenados en el álbum como el mazo de cromos repetidos para intercambiar.

    El programa debe mostrar:

    • a) Los cromos que salen en cada sobre.
    • b) Un listado de todos los cromos que tengo en el álbum.
    • c) Un listado de todos los cromos de programadores locos.
    • d) Un listado de todos los cromos de lenguajes de programación.
    • e) Un listado de todos los cromos que me faltan.
    • f) Un listado de todos los cromos que tengo en el mazo.

    Se han de controlar todas las excepciones que consideres así como usar expresiones regulares si lo consideras pertinente.

  • PR 911 (RA6 / CE6a CE6b CE6c CE6d CE6e CE6f CE6g / IC2 / 5p). Los alumnos de programación de 1º de DAW han creado un foro para intercambiar cromos de “Programadores Locos y sus Locos Lenguajes de Programación”. Pero se han dado cuenta que algunos de los alumnos más malvados que pueblan el Aula I01, con métodos criminales más propios de la Yakuza, están creando múltiples cuentas para inflar los precios y controlar el mercado negro de cromos de PLyLLP. Para evitar estos problemas han decidido que los alumnos solo podrán tener una única cuenta activa en el foro al mismo tiempo.

    Los alumnos se registran en el foro creando una cuenta con un pseudónimo, su email y una contraseña. Los alumnos pueden crear tantas cuentas como quieran con el mismo email. Una vez que usuario se valida con su cuenta y accede al foro, no podrá validarse ningún otro usuario con el mismo email.

    Crea una pequeña aplicación en Java, utilizando las colecciones que estimes oportunas, que permita crear y almacenar las cuentas de usuario. Autenticar a los usuarios y mantener un registro de los usuarios que están conectados en el foro, impidiendo que un alumno este activo con dos cuentas a la vez. El programa debe mostrar:

    • a) Todos los usuarios registrados en el foro con todos sus datos.
    • b) Los usuarios actualmente validados en el foro.

    Se han de controlar todas las excepciones que consideres así como usar expresiones regulares si lo consideras pertinente.

  • PR 912 (RA6 / CE6a CE6b CE6c CE6d CE6e CE6f CE6g / IC2 / 5p). Después de recorrer el Camino de Baldosas Amarillas y enfrentarte a varias brujas malvadas, llegas a la Ciudad Esmeralda y compruebas que para hablar con el Mago de Oz tienes que pedir cita previa.

    Para acceder al sistema de citas te tienes que registrar con tus datos personales, DNI, y el deseo que quieres que te conceda el mago. Solo se puede pedir una cita por cada demandante de ayuda. El sistema almacenará la cita, y el Mago, cuando sea tu turno, te concederá tu deseo o no, a su voluntad.

    Realiza un programa en Java, utilizando las colecciones que estimes oportunas, para crear el sistema de cita previa del Mago de Oz. Debe permitir inscribirse en el sistema y que el Mago procese las citas únicas e identificadas por DNI y conceda o no los deseos.

    Ayuda

    Puedes crear a Dorothy que quiere volver a Kansas, al Hombre de Hojalata que quiere un corazón, al Espantapájaros que quiere un cerebro y al León que quiere ser valiente.

    El programa debe mostrar:

    • a) El listado de citas previas con todos los datos de los demandantes.
    • b) El proceso de concesión o no de deseos por parte del mago.

    Se han de controlar todas las excepciones que consideres así como usar expresiones regulares si lo consideras pertinente.

  • PR 913 (RA6 / CE6a CE6b CE6c CE6d CE6e CE6f CE6g / IC2 / 5p). Tu amigo Jacobo Racho va a abrir una elegante chupitería llamada el Bar Bitúrico. Pero como es más vago que el sastre de Tarzán, te ha pedido que le crees un programa que genere los chupitos aleatoriamente.

    Las bebidas del bar las tenemos clasificadas en las siguientes categorías:

      1. Alta graduación: whisky, ron, ginebra, vodka, tequila… todo bebidas de 40º o más
      1. Baja graduación: licores y demás bebidas con menos alcohol, 20º o menos.
      1. Refrescos y otras bebidas sin alcohol
      1. Zumos y bebidas naturales
      1. Otras: botánicos, semillas y otras chorradas.

    Un chupito está formado por un mínimo de 2 ingredientes y un máximo de 4. Si son dos ingredientes será uno de la primera y otro de la segunda categoría, si son 3 se añadirá otro de la tercera o la cuarta categoría, y si son 4 ingredientes, se añadirá otro más de la quinta.

    Jacobo Racho nos ha pedido que le hagamos un programa que almacene las bebidas y que genere chupitos aleatoriamente. También quiere guardar los chupitos generados con un nombre que debe ser único. Crea un programa en Java que realice esta tarea utilizando las colecciones que estimes oportunas.

    El programa deberá mostrar:

    • a) Las bebidas de cada categoría.
    • b) Los ingredientes de los chupitos generados y pedirá su nombre.
    • c) Todos los chupitos guardados con todos sus datos.
    • d) Todos los chupitos con un ingrediente concreto.
    • e) Todos los chupitos que no tengan un ingrediente concreto.
    • f) Todos los chupitos que tengan 3 o más ingredientes.

    Se han de controlar todas las excepciones que consideres así como usar expresiones regulares si lo consideras pertinente.