Question

J'ai un assez gros (100'000 entrées) HashMap . Maintenant, il me faut un HashSet contenant toutes les clés de ce HashMap . Malheureusement, HashMap n'a qu'une méthode keySet () qui renvoie un Set mais pas un HashSet .

Quel serait un moyen efficace de générer un tel HashSet en utilisant Java?

Était-ce utile?

La solution

Pourquoi avez-vous spécifiquement besoin d'un HashSet?

Tous les ensembles ont la même interface. Ils peuvent donc généralement être utilisés de manière interchangeable, car les bonnes pratiques vous obligent à utiliser l'interface Ensemble pour tous.

Si vous en avez vraiment besoin, vous pouvez en créer un à partir de l'autre. Pour le code générique, cela pourrait être:

    Map<B, V> map = ...;
    HashSet<B> set = new HashSet<B>(map.keySet());

Autres conseils

En supposant que le mot "efficace" soit l'élément clé de votre question, et en fonction de ce que vous voulez faire avec l'ensemble, il peut être judicieux de créer votre propre sous-classe de HashSet, qui ignore l'application de HashSet et présente une vue. sur la carte existante, à la place.

En tant qu'exemple partiellement implémenté, il pourrait ressembler à:

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 vous ne savez pas comment la classe sera utilisée, vous devez prendre le soin de remplacer toutes les méthodes pertinentes.

HashSet myHashSet = new HashSet(myHashMap.keySet());

Je n'ai pas essayé.

Ne pouvez-vous pas créer le HashSet à partir d'un Ensemble existant? Mais plus important encore, pourquoi vous inquiétez-vous de la mise en oeuvre renvoyée par la méthode keySet () ?

Définir set = new HashSet (map.keySet ());

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top