Domanda

Ho un abbastanza grande (100.000 voci) HashMap . Ora, ho bisogno di un HashSet contenente tutte le chiavi di questo HashMap . Sfortunatamente, HashMap ha solo un metodo keySet () che restituisce un Set ma non un HashSet .

Quale sarebbe un modo efficace per generare un tale HashSet usando Java?

È stato utile?

Soluzione

Perché hai bisogno specificamente di un HashSet?

Qualsiasi set ha la stessa interfaccia, quindi in genere può essere usato in modo intercambiabile, poiché le buone pratiche richiedono l'uso dell'interfaccia set per tutti.


Se ne hai davvero bisogno, puoi crearne uno dall'altro. Per il codice generico, potrebbe essere:

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

Altri suggerimenti

Supponendo che la parola "efficiente" sia la parte fondamentale della tua domanda e, a seconda di cosa vuoi fare con il set, potrebbe essere un'idea creare la tua sottoclasse di HashSet che ignora l'implementazione di HashSet e presenta una vista sulla mappa esistente, invece.

Come esempio parzialmente implementato, potrebbe assomigliare a:

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... */
}

Se non sai come verrà utilizzata la classe, dovrai fare attenzione a sovrascrivere tutti i metodi pertinenti.

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

Non l'ho provato.

Non puoi creare il HashSet da un Set esistente? Ma (ancora più importante) perché sei preoccupato per l'implementazione che ti è stata restituita dal metodo keySet () ?

Set set = new HashSet (map.keySet ());

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top