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?

¿Fue útil?

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 ());

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top