Obtenir un HashSet de l'clés d'une table de hachage?
J'ai un assez gros (100'000s d'entrées) HashMap
. Maintenant, j'ai besoin d'un HashSet
contenant toutes les clés de cette HashMap
. Malheureusement, HashMap
ne dispose que d'un keySet()
méthode qui renvoie une Set
mais pas un HashSet
.
Ce serait une façon efficace de générer un tel HashSet
à l'aide de Java?
- Pourquoi avez-vous besoin d'un HashSet et pas juste un Jeu?
- Une méthode que j'ai appeler a besoin d'un HashSet et le code correspondant est n'était pas écrit par moi.
- eww. celui qui a écrit cette méthode a besoin d'un bon de parler à. 🙂
- +1 à Votre commentaire explique tout. Heureux que vous avez trouvé une solution. 🙂
- Vous devriez savoir qu'il y a un gain de performance. Lorsque vous construisez le HashSet de keySet(), il devra en principe se dupliquer l'intégralité du jeu. Je ne suis pas sûr combien de temps il faut pour ce faire sur les 100 000 s d'éléments, mais il va certainement consomment beaucoup de mémoire. Je sais que vous n'avez pas d'autre option, mais cela peut vous donner plus de munitions à la demande de celui qui a écrit la méthode de le modifier afin qu'il prend un Ensemble plutôt qu'un HashSet. (Et à moins qu'ils sont en train de faire quelque chose de vraiment bizarre, ils devraient être en mesure de simplement changer le paramètre et le reste en œuvre sans modification).
- Sauf si c'est un très bureaucratique projet que la méthode doit être réécrit (HashSet doit être remplacé par set). Si la méthode est trop long et alambiqué pour la refactorisation - eh bien, ce est un problème majeur. Une méthode doit faire une chose et ne devraient pas dépasser 10 lignes (20 lignes ne sont justifiées que si une instruction switch est utilisé).
Vous devez vous connecter pour publier un commentaire.
Pourquoi vous avez spécifiquement besoin d'un HashSet?
Tout Ensemble ont la même interface, de sorte que généralement peuvent être utilisés de façon interchangeable, comme de bonnes pratiques, nécessite l'utilisation de l'Ensemble de l'interface pour tous.
Si vous en avez vraiment besoin, vous pouvez créer un de l'autre. Pour le code générique, il pourrait être:
Set<B> set = map.keySet();
? Si un HashSet est nécessaire,set
devrait être un HashSet, pas un Jeu. Siset
peut être unSet
, alors il n'y a pas besoin d'appeler le HashSet constructeurEn supposant que le mot "efficace" est la clé de la partie de votre question, et selon ce que vous voulez faire avec le jeu, il pourrait être une idée pour créer votre propre sous-classe HashSet qui ignore le HashSet la mise en œuvre et présente une vue sur la carte, à la place.
Comme partiellement mise en œuvre d'exemple, il pourrait ressembler à quelque chose comme:
Si vous ne savez pas comment la classe sera utilisé, vous aurez besoin de prendre soin de remplacer toutes les méthodes pertinentes.
keySet()
est un Jeu, pas une table de hachage.N'ai pas essayé.
Pouvez-vous ne pas créer la
HashSet
à partir d'unSet
? Mais (surtout) pourquoi êtes-vous inquiet au sujet de la mise en œuvre retourné à partir de lakeySet()
méthode ?Set=new HashSet(la carte.keySet());