Bienvenido a re-orientation! Esperamos que encuentres lo que buscas

Soluciones eficientes combinando ArrayList HashSet y HashMap

Imaginaros que tenemos dos colecciones de objetos, la colección A y la colección B, donde B es un conjunto de objetos reducido de A. Si necesitáramos obtener, a partir de los datos anteriores, un contenedor C donde por cada elemento de A sepa si existe en el conjunto B o no, ¿como podríamos realizar esto de manera sencilla y sin necesidad de anidar bucles?

Hay varias formas de resolver el caso de uso anterior usando Java, en nuestro caso el objetivo es ilustrar el uso combinando de ArrayList, HashSet y HashMap, así que veremos una manera eficiente de implementar la solución.

Nos apoyaremos principalmente en la clase java.util.HashSet, que está pensada específicamente para trabajar con conjuntos y nos permite buscar de manera rápida elementos dentro de uno. Para modelar el ejemplo: A, será un HashList; B un HashSet; y el resultado del cruce, C, un HashMap.

Implementando la solución:

Para ilustrar mejor el código, haremos que la colección A, sea una lista de actitudes (Skills): Cada actitud será un objeto de tipo Skill, que tiene dos atributos: el nombre de la actitud (es un texto) y la relevancia (puede ser un valor del 1 al 10). En esta lista estarán todas las actitudes a considerar (por ej.: Adaptabilidad , Tenacidad, Autodisciplina, Integridad, Independencia, Creatividad, Liderazgo, Proactividad, Iniciativa, Energía, Compromiso y Liderazgo).

List<Skill> allSkills = new ArrayList<Skill>(); 
allSkills = skillService.getAllSkills(); 

El conjunto B, serán las aptitudes concretas de un individuo. En el contexto de una selección laboral, imaginaros al Candidato X con un conjunto de actitudes de la lista anterior (por ej., las que incluyó en su curriculum: Independencia, Creatividad e Iniciativa).

HashSet<String> userSkills = new HashSet<String>(user.getSkills()); 

El contenedor resultante C, será de tipo clave/valor. En este HashMap almacenaré, por cada actitud de mi lista original, si el em>Candidato X la posee o no.

HashMap<Skill, Boolean> crossingSkills = new HashMap<Skill, Boolean>();

Una vez definidas las partes, usaremos el método contains(Object o) de HashSet para saber si el conjunto contiene el elemento especificado como atributo (en caso afirmativo devolverá TRUE). El resultado de esta pregunta lo almacenaremos asociado a la actitud en nuestro HashMap resultante.

El código resultante, quedaría asi.

List<Skill> allSkills = new ArrayList<Skill>(); 
allSkills = skillService.getAllSkills(); 
// skillService.getAllSkills devolverá todas las aptitudes que se valoran.
                    
HashSet<String> userSkills = new HashSet<String>(user.getSkills()); 
//userSkills contendrá los nombres de las actitudes que posee el candidato

HashMap<Skill, Boolean> crossingSkills = new HashMap<Skill, Boolean>();

for (int i = 0; i < allSkills.size(); i++) { 
  Skill skillN = allSkills.get(i);
  if (userSkills.contains(skillN.getName()) ){
         crossingSkills.put(skillN, true); 
		 //la actitud a valorar se encuentra en el conjunto de actitudes concretas del candidato
  } else {
         crossingSkills.put(skillN, false);  
		 //la actitud a valorar no se encuentra en el conjunto de actitudes concretas del candidato
  }
}
Terminos Tecnología: