Frage

Ich habe eine ziemlich große (100'000s von Einträgen) HashMap. Nun, ich brauche eine HashSet alle Schlüssel aus diesem HashMap enthält. Leider HashMap nur eine keySet() Methode hat, die ein Set gibt aber keinen HashSet.

Was wäre ein effizienter Weg sein, eine derartige HashSet zu erzeugen Java verwenden?

War es hilfreich?

Lösung

Warum brauchen Sie speziell ein HashSet?

Jedes Set hat die gleiche Schnittstelle kann so typischerweise austauschbar verwendet werden, wie gut Praktiken erfordern, dass Sie die Set-Schnittstelle für alle von ihnen verwenden.


Wenn Sie wirklich so brauchen, könnten Sie erstellen von der anderen Seite. Bei generischem Code, könnte es sein:

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

Andere Tipps

Unter der Annahme, dass das Wort ‚effizient‘ der Schlüssel Teil Ihrer Frage ist, und je nachdem, was Sie mit dem Satz tun wollen, könnte es eine Idee sein, eigene Unterklasse von HashSet zu schaffen, die die HashSet Implementierung ignoriert und stellt eine Ansicht auf die vorhandene Karte, statt.

Als Teil umgesetzt Beispiel, es könnte etwas wie folgt aussehen:

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

Wenn Sie nicht wissen, wie die Klasse verwendet werden, müssen Sie darauf achten, alle relevanten Methoden außer Kraft zu setzen.

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

Hat es nicht versucht.

Können Sie nicht die HashSet aus einem bestehenden Set erstellen? Aber (noch wichtiger), warum sind Sie besorgt über die Umsetzung zu Ihnen von der keySet() Methode zurückgegeben?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top