¿Obtener un HashSet de las teclas de un HashMap?
Pregunta
Tengo un HashMap
bastante grande (100'000 de entradas). Ahora, necesito un HashSet
que contenga todas las claves de este HashMap
. Desafortunadamente, HashMap
solo tiene un método keySet ()
que devuelve un Set
pero no un HashSet
.
¿Cuál sería una manera eficiente de generar tal HashSet
usando Java?
Solución
¿Por qué necesita específicamente un HashSet?
Cualquier conjunto tiene la misma interfaz, por lo que generalmente se puede usar indistintamente, ya que las buenas prácticas requieren que use la interfaz de conjunto para todos ellos.
Si realmente lo necesita, puede crear uno del otro. Para el código genérico, podría ser:
Map<B, V> map = ...;
HashSet<B> set = new HashSet<B>(map.keySet());
Otros consejos
Suponiendo que la palabra 'eficiente' es la parte clave de su pregunta, y dependiendo de lo que quiera hacer con el conjunto, podría ser una idea crear su propia subclase de HashSet que ignore la implementación de HashSet y presente una vista en el mapa existente, en su lugar.
Como ejemplo implementado parcialmente, podría verse algo así como:
public class MapBackedHashSet extends HashSet
{
private HashMap theMap;
public MapBackedHashSet(HashMap theMap)
{
this.theMap = theMap;
}
@Override
public boolean contains(Object o)
{
return theMap.containsKey(o);
}
/* etc... */
}
Si no sabe cómo se usará la clase, deberá asegurarse de anular todos los métodos relevantes.
HashSet myHashSet = new HashSet(myHashMap.keySet());
No lo he probado.
¿No puede crear el HashSet
a partir de un Set
existente? Pero (más importante) ¿por qué le preocupa la implementación que le devolvió el método keySet ()
?
Set set = new HashSet (map.keySet ());