quelle est la meilleure façon d'obtenir une sous table de hachage basée sur une liste de Clés?
J'ai une table de hachage et je voudrais obtenir une nouvelle table de hachage qui contient uniquement les éléments de la première table de hachage, où K appartient à une Liste spécifique.
Je pouvais regarder à travers toutes les clés et les fillup une nouvelle table de hachage, mais je me demandais si il ya un moyen plus efficace de le faire?
grâce
OriginalL'auteur aregnier | 2015-03-04
Vous devez vous connecter pour publier un commentaire.
Avec Java8 volets, il y a une fonctionnelle (élégant) solution. Si
keys
est la liste des clés pour maintenir etmap
est la sourceMap
.Exemple complet:
Imprime:
{2=bar, 3=fizz}
MODIFIER ajouter un
filter
pour les touches qui sont absents de la cartemap.put(2, "bar");
vous obtenez unNullPointerException
.Ok, bon point. Vous avez juste à ajouter un
filter
. Voir MODIFIERdésolé, mais je ne peux pas utiliser java8 à ce point.
OriginalL'auteur T.Gounelle
En fonction de votre utilisation, cela peut être une application plus efficace
ak.contains
est O(n) vs O(1) si une nouvelle carte est utilisée à la place d'un point de vue - qui pourrait être un problème.OriginalL'auteur ControlAltDel
Oui, il y a une solution:
La
retainAll
opération sur leSet
les mises à jour de la carte sous-jacente. Voir java doc.Modifier
Être au courant de la solution de modifier le
Map
.HashMap
.vous avez raison... argh
OriginalL'auteur T.Gounelle
Si vous avez la Carte m1 et de la Liste des touches, puis essayez de suivre
OriginalL'auteur Evgeniy Dorofeev
Avec l'aide de Goyave.
Supposons que vous avez une carte
Map<String, String>
et souhaitez sous-carte avec l'une des valeurs deList<String>
liste.Mise à jour /Remarque: Comme @assylias mentionnées dans le commentaire, vous aurez O(n) lors de l'utilisation de
contains()
. Donc, si vous avez de grands liste, cela pourrait avoir un impact énorme dans la performance.De l'autre côté
HashSet.contains()
est temps constant O(1), donc si il y a une possibilité d'avoir Mis en place de Liste, cela pourrait être une bonne approche (note que la Liste de conversion de Jeu de coût O(n) de toute façon, donc mieux vaut ne pas convertir :))Très bon point. Mise à jour de ma réponse à mentionner l'impact de la performance sur les listes énormes.
J'aimerais utiliser de Goyave sur ce projet, mais je ne peux pas. Aussi la solution est intéressante, mais j'aimerais savoir si il existe une solution sans une bibliothèque externe.
OriginalL'auteur vtor
Si vos clés ont une commande, vous pouvez utiliser un TreeMap.
Regarder
TreeMap.subMap()
Il ne vous permet pas de le faire à l'aide d'une liste, bien que.
OriginalL'auteur user1717259
Au lieu de regarder à travers toutes les clés que vous pourriez en boucle sur la liste et de vérifier si la table de hachage contient une correspondance. Puis créer une nouvelle table de hachage avec l'filtré les entrées:
new
comme nom de variable.Vous avez raison, le changement de nom de la variable newMap.
vous devez utiliser
new HashMap<> (keys.size(), 1f);
, sinon une charge fatcor de 0,75 seront utilisés et la carte peuvent être redimensionnés à la foisìf (value != null)
n'est pas valide pour substituer aucontainsKey
avec table de hachage. On pourrait ont écrithashMap.put("key", null)
, puis votreif (value != null)
test serait dupe. (Certes, c'est un très fréquentes design à ce point que la fixation d'une valeur null dans une Carte semble être une mauvaise idée en premier lieu)il ya des cas où vous voudrez peut-être stocker des valeurs null dans votre HashMap (vous pouvez toujours vérifier si elle contient la clé pour lever l'ambiguïté entre une correspondance avec la valeur null ou l'absence de valeur pour la clé)... par exemple, quand vous l'utiliser pour mettre en cache les résultats de l'ordinateur les fonctions gourmandes (d'où le résultat pourrait être null)... donc cela ne fonctionnerait pas.
OriginalL'auteur helpermethod
Copie de la carte d'une suppression de toutes les touches de pas dans la liste avec les méthodes standard:
OriginalL'auteur kapex
vous pouvez utiliser la méthode clone() de la K HashMap retourné.
quelque chose comme ceci:
Il peut avoir des erreurs de syntaxe, car je n'ai pas testé, mais essayez quelque chose comme ça.
OriginalL'auteur Bruno Paulino
Non, parce que la table de hachage n'est pas de maintenir un ordre de ses entrées. Vous pouvez utiliser TreeMap si vous avez besoin d'une sous-carte entre certaines limites. Et aussi, s'il vous plaît regardez cette question; il semble être sur les lignes similaires à la vôtre.
OriginalL'auteur geekprogrammer
Vous avez demandé une nouvelle
HashMap
. DepuisHashMap
ne prend pas en charge la structure de partage, il n'y a pas de meilleure approche que la plus évidente. (J'ai supposé ici quenull
ne peut pas être une valeur).Si vous n'avez pas absolument besoin de ce nouvel objet créé est un
HashMap
vous pouvez créer une nouvelle classe (idéalement l'extension deAbstractMap<K, V>
) représentant une vue restreinte de l'originalMap
. La classe aurait deux finale privée champsLa
get
méthode pour la nouvelleMap
serait quelque chose comme ceciAvis que c'est mieux si le
restrictedSetOfKeys
est unSet
plutôt qu'unList
parce que si c'est unHashSet
vous aurait généralement O(1) fois la complexité de laget
méthode.OriginalL'auteur Paul Boddington
Vous pourriez même développer votre propre:
Si vous êtes inquiet au sujet de l'ensemble de la copie vous pouvez également cultiver une filtré
Set
et un filterdIterator
à la place.OriginalL'auteur OldCurmudgeon