Ottieni un HashSet dalle chiavi di un HashMap?
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?
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 ());