Holen Sie sich ein HashSet aus die Schlüssel einer HashMap?
Ich habe eine ziemlich große (100'000s Einträge) HashMap
. Jetzt brauche ich ein HashSet
mit allen Schlüsseln aus dieser HashMap
. Leider HashMap
nur keySet()
Methode gibt eine Set
aber nicht HashSet
.
Was wäre ein effizienter Weg, um erzeugen eine solche HashSet
mit Java?
Warum brauchen Sie ein HashSet und nicht nur ein Satz?
Eine Methode, die ich anrufen muss ein HashSet und der entsprechende code ist nicht von mir geschrieben.
eww. wer schrieb, dass die Methode braucht eine gute Unterhaltung. 🙂
+1 Ihr Kommentar erklärt alles. Froh, dass Sie eine Lösung gefunden. 🙂
Sie sollten wissen, dass es zu einem Leistungseinbruch. Wenn Sie bauen die HashSet von keySet(), wird es im Grunde duplizieren Sie den gesamten Satz. Ich bin mir nicht sicher, wie lange es dauert, dies zu tun auf 100.000 s von Elementen, aber es ist definitiv zu fressen eine Menge Speicher. Ich weiß, Sie haben keine andere option, aber das könnte Euch mehr Munition zu verlangen, wer schrieb die Methode zu ändern, so dauert es eine Reihe eher als ein HashSet. (Und, es sei denn, Sie tun etwas, das wirklich komisch ist, sollte Sie in der Lage, nur den parameter ändern und der rest funktioniert mit keine änderung).
Eine Methode, die ich anrufen muss ein HashSet und der entsprechende code ist nicht von mir geschrieben.
eww. wer schrieb, dass die Methode braucht eine gute Unterhaltung. 🙂
+1 Ihr Kommentar erklärt alles. Froh, dass Sie eine Lösung gefunden. 🙂
Sie sollten wissen, dass es zu einem Leistungseinbruch. Wenn Sie bauen die HashSet von keySet(), wird es im Grunde duplizieren Sie den gesamten Satz. Ich bin mir nicht sicher, wie lange es dauert, dies zu tun auf 100.000 s von Elementen, aber es ist definitiv zu fressen eine Menge Speicher. Ich weiß, Sie haben keine andere option, aber das könnte Euch mehr Munition zu verlangen, wer schrieb die Methode zu ändern, so dauert es eine Reihe eher als ein HashSet. (Und, es sei denn, Sie tun etwas, das wirklich komisch ist, sollte Sie in der Lage, nur den parameter ändern und der rest funktioniert mit keine änderung).
InformationsquelleAutor Haes | 2009-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum haben Sie speziell benötigen ein HashSet?
Jeder Satz die gleiche Schnittstelle, so können in der Regel Synonym verwendet werden, so gut-Praktiken erfordert, dass Sie die Schnittstelle für alle von Ihnen.
Wenn Sie wirklich brauchen, so könnten Sie sich eins aus dem anderen. Für generischen code, es könnte sein:
Set<B> set = map.keySet();
? Ob tatsächlich ein HashSet ist erforderlich,set
sollte ein HashSet, und nicht ein Satz. Wennset
kann einSet
, dann gibt es keine Notwendigkeit, rufen Sie den Konstruktor HashSetDanke, wenn ich das nächste mal besser RTFM 😉
Vielen Dank für Ihren nützlichen Kommentar. Ich leicht geklärt mein Codebeispiel zu berücksichtigen.
Kip: du hast Recht. Tatsächlich, ich verwendete den folgenden code: HashSet<B> set = new HashSet<B>(auf der Karte.keySet());
Warum haben Sie speziell benötigen ein HashSet? Da HashSet serialisierbar ist, während LinkedKeySet nicht 🙂
InformationsquelleAutor KLE
Unter der Annahme, dass das Wort "effizient" ist der wichtigste Teil Ihrer Frage, und je nachdem, was Sie wollen mit dem Satz, es könnte eine gute Idee sein, erstellen Sie Ihre eigenen Subklasse von HashSet, die ignoriert die HashSet-Implementierung und stellt eine Sicht auf die bestehende Karte, statt.
Als teilweise umgesetzt Beispiel, es könnte so Aussehen:
Wenn Sie nicht wissen, wie die Klasse verwendet wird, werden Sie brauchen zu kümmern, überschreiben alle relevanten Methoden.
keySet()
ist ein Satz, nicht eine HashMap.Der Punkt ist, dass Sie nicht brauchen, um zu extrahieren, die auf diesem Weg gesetzt. Dies ist zu vermeiden, die Schaffung einer neuen hash aus einer potenziell großen Anzahl von Objekten.
InformationsquelleAutor izb
Habe es nicht ausprobiert.
InformationsquelleAutor sinuhepop
Können Sie nicht erstellen Sie die
HashSet
aus einer vorhandenenSet
? Aber (noch wichtiger) warum sind Sie besorgt über die Umsetzung zurückgegeben, um Sie aus derkeySet()
Methode ?InformationsquelleAutor Brian Agnew
Set Set=new HashSet(Karte anzeigen.keySet());
InformationsquelleAutor Telcontar