Obter uma HashSet fora das teclas de um HashMap?
Pergunta
Eu tenho um grande bonita (100'000s de entradas) HashMap
. Agora, eu preciso de um HashSet
contendo todas as chaves deste HashMap
. Infelizmente, HashMap
só tem um método keySet()
que retorna um Set
mas não um HashSet
.
O que seria uma maneira eficiente de gerar tal HashSet
usando Java?
Solução
Por que você precisa especificamente um HashSet?
Qualquer Set têm a mesma interface, tão tipicamente podem ser usados ??alternadamente, como boas práticas exige que você use a interface Set para todos eles.
Se você realmente precisa-lo, você poderia criar um do outro. Para código genérico, poderia ser:
Map<B, V> map = ...;
HashSet<B> set = new HashSet<B>(map.keySet());
Outras dicas
Assumindo que a palavra 'eficiente' é a peça chave da sua pergunta, e dependendo do que você quer fazer com o conjunto, pode ser uma idéia para criar sua própria subclasse de HashSet que ignora a implementação HashSet e apresenta uma visão para o mapa existente, em vez disso.
Como um exemplo parcialmente implementada, ela poderia ser algo 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... */
}
Se você não sabe como a classe será usado, você precisa tomar cuidado para substituir todos os métodos relevantes.
HashSet myHashSet = new HashSet(myHashMap.keySet());
não tentei-lo.
Você não pode criar o HashSet
de um Set
existente? Mas (mais importante) por que você está preocupado com a implementação devolvido a você a partir do método keySet()
?
Set set = new HashSet (map.keySet ());