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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top