Holen Sie sich einen HashSet aus den Tasten eines HashMap?
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?
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 ());