Comment comparer deux cartes par leurs valeurs
Comment comparer deux cartes par leurs valeurs? J'ai deux cartes contenant des valeurs égales et pour les comparer par leurs valeurs. Voici un exemple:
Map a = new HashMap();
a.put("foo", "bar"+"bar");
a.put("zoo", "bar"+"bar");
Map b = new HashMap();
b.put(new String("foo"), "bar"+"bar");
b.put(new String("zoo"), "bar"+"bar");
System.out.println("equals: " + a.equals(b)); //obviously false
.... what to call to obtain a true?
[[ EDIT: quelqu'un merci d'éditer et de corriger cette question pour signifier que c'est en fait censé signifier. Le code ci-dessus affiche "vrai", pas "faux". ]]
Évidemment, pour mettre en œuvre une comparaison, il n'est pas difficile, il suffit de comparer toutes les clés et leurs valeurs associées. Je ne crois pas que je suis le premier à le faire, donc il y a déjà une bibliothèque de fonctions soit en java ou dans l'un de jakarta.communes bibliothèques.
Grâce
Doit être sain d'esprit maintenant que les deux cartes sont les mêmes dans au moins sens...
Ce exact sorte de similitude cherchez-vous? Similitude par "cette carte a le même ensemble de (clé,valeur) correspondances que l'on"?
-1 - cette question est totalement ambigu.
Ce exact sorte de similitude cherchez-vous? Similitude par "cette carte a le même ensemble de (clé,valeur) correspondances que l'on"?
-1 - cette question est totalement ambigu.
OriginalL'auteur paweloque | 2010-04-20
Vous devez vous connecter pour publier un commentaire.
Vos tentatives pour construire des chaînes différentes en utilisant la concaténation va échouer car il est effectué au moment de la compilation. Ces deux cartes ont une seule paire, chaque paire aura "foo" et "barbar" comme la clé/valeur, à la fois à l'aide de la même chaîne de référence.
En supposant que vous voulez vraiment comparer les ensembles de valeurs, sans aucune référence à des touches, c'est juste une affaire de:
C'est possible que la comparaison de
map1.values()
avecmap2.values()
ne fonctionne - mais il est également possible que l'ordre dans lequel ils sont retournés seront utilisés dans la comparaison d'égalité, ce qui n'est pas ce que vous voulez.Noter que l'utilisation d'un ensemble a ses propres problèmes - parce que le code ci-dessus serait de considérer qu'une carte de {"a":"0", "b":"0"} et {"c":"0"}, être égal... la valeur ensembles sont égaux, après tout.
Si vous pouvez fournir une définition plus stricte de ce que vous voulez, il sera plus facile pour nous assurer de vous donner la bonne réponse.
Pour atteindre le résultat qui, je crois, que l'OP veut. Votre réponse compare les clés ainsi que les valeurs. Je crois que l'OP veut une carte de
{"a"=1, "b"=2 }
être égale à une carte de{"c"=2, "d"=1}
par exemple.L'OP est ambiguë sur cette partie. Si c'est purement valeurs de comparaison, c'est incertaine [1] comment il veut gérer les doublons [2] s'il veut comparer des valeurs par les touches. Maintenant, étant donné que votre réponse est "accepté", on dirait qu'il veut doublons ignoré la valeur de comparaison.
En effet. Et c'est pourquoi j'ai demandé plus de précisions si possible, et explicitement donné un exemple d'utilisation de doublons mais vu que l'OP a accepté ma réponse, je suppose que est, ce qu'ils cherchaient.
OriginalL'auteur Jon Skeet
La bonne façon de comparer les cartes de la valeur d'égalité est de:
En d'autres termes (moins d'erreur de manipulation):
Map.equals
?Pour la valeur de l'égalité, c'est trop strict d'un test. Il teste non seulement pour la valeur de l'égalité, mais aussi pour la valeur-clé de la carte de l'égalité.
Je suppose que je ne vois pas le point de la comparaison de valeurs. Il manque au moins un troupeau d'éléphants dans la pièce; une différence sur le plan, juste n'est pas sur le même. @poly: Hmm, il n'est pas différent. Je suppose que c'est pourquoi qu'est ce que l'opération d'égalité est définie à l'être. 🙂 Je pense que le problème a été causé par l'interlocuteur viens de mettre à jour la mauvaise carte ou quelque chose de tout aussi fondamentale.
Je suis d'accord avec vous sur le point, mais l'OP semblait se demander à propos de la valeur d'égalité, pas de clé-valeur de la carte de l'égalité. Autrement il n'y a aucun point de la question.
longtemps après les faits...) La vraie différence est que
Map.equals
est prudent surnull
des clés et des valeurs (et est un peu plus efficace aussi).OriginalL'auteur Donal Fellows
Pour voir si les deux cartes ont la même valeur, vous pouvez effectuer les opérations suivantes:
Collection<V> values()
vuesList<V>
Collections.sort
ces listesequals
Quelque chose comme cela fonctionne (même si son type de limites peuvent être améliorées):
Harnais de Test:
C'est
O(N log N)
en raison deCollections.trier
.Voir aussi:
la Collection<V> value()
Pour tester si le clés sont égale est plus facile, parce qu'ils sont
Set<K>
:Voir aussi:
<K> keySet()
map1
a (A=>B,C=>D), etmap2
a (A=>D,C=>B) ensuite, ils ont les mêmes valeurs et les touches (et peut-être même les énumérer dans le même ordre; ce n'est pas garanti!) mais ils sont encore manifestement différentes.ajouté la liste triée version et votre harnais de test; il devrait maintenant fonctionner.
OriginalL'auteur polygenelubricants
Tous ces éléments sont de retour égal à égal. Ils sont en train de faire une comparaison, ce qui est utile pour le tri. Cela se comportent plus comme un élément de comparaison:
OriginalL'auteur Dana
Cette question est ancienne, mais toujours d'actualité.
Si vous voulez comparer deux cartes par leurs valeurs correspondant à leurs touches, vous pouvez le faire comme suit:
Oui, rien de plus.
OriginalL'auteur Manu M.
Puisque vous avez demandé à propos de prêt-à-Api ... et bien d'Apache commons. les collections de la bibliothèque dispose d'un CollectionUtils classe qui fournit facile à utiliser des méthodes pour la Collecte, la manipulation et de vérification, tels que l'intersection, différence, et de l'union.
OriginalL'auteur Narayan
Je ne pense pas qu'il y est une "apache-common-comme" outil pour comparer les cartes depuis l'égalité des 2 cartes est très ambigu et dépend du développeur besoins et le plan de mise en œuvre...
Par exemple, si vous comparez les deux hashmaps en java:
- Vous pouvez simplement comparer les clés/valeurs sont les mêmes
- Vous pouvez également comparer si les clés sont ordonnées de la même façon
- Vous pouvez également comparer si la capacité restante est la même
... Vous pouvez comparer un grand nombre de choses!
Ce qu'un tel outil pourrait faire lorsque l'on compare les 2 cartes différentes implémentations telles que:
- Une carte permettre clés null
- L'autre jeter exception d'exécution sur map2.get(null)
Vous feriez mieux de mettre en œuvre votre propre solution en fonction de ce que vous avez vraiment besoin de faire, et je pense que vous avez déjà quelques réponses ci-dessus 🙂
OriginalL'auteur Sebastien Lorber
Si l'on suppose qu'il peut y avoir des valeurs en double la seule façon de le faire est de mettre les valeurs dans les listes, de les trier et de comparer les listes, à savoir:
Si les valeurs ne peuvent pas contenir des doublons, alors vous pouvez le faire ci-dessus sans les trier à l'aide des ensembles.
Collections.sort
est "fluide" (je pense que c'est le terme), mais non, il retournevoid
.Err oui, mon erreur. Édité pour résoudre ce problème.
OriginalL'auteur Dean Povey
Le résultat d'égal à égal dans votre exemple est évidemment faux, car vous êtes en comparant la carte un avec certaines valeurs qu'il vide la carte b (probablement un copier-coller de l'erreur). Je recommande d'utiliser des noms de variables (de sorte que vous pouvez éviter ces types d'erreurs) et de faire usage des médicaments génériques, trop.
La concaténation de vos chaînes n'ont pas d'effet, car il sera fait au moment de la compilation.
OriginalL'auteur Daff
@paweloque Pour la Comparaison de deux Objets de la Carte en java, vous pouvez ajouter les clés d'une carte à la liste et avec ces 2 listes, vous pouvez utiliser les méthodes retainAll() et removeAll() et de les ajouter à une autre liste de clés et les différentes touches de la liste. À l'aide des touches de la liste commune et différente de la liste, vous pouvez parcourir la carte, à l'aide est égal, vous pouvez comparer les cartes.
Le code ci-dessous donnera de sortie comme ceci:
Avant de {zoo=barbar, foo=barbar}
Après {zoo=barbar, foo=barbar}
L'égalité: Avant - barbar Après - barbar
L'égalité: Avant - barbar Après - barbar
OriginalL'auteur tinker_fairy
OriginalL'auteur stones333
Si vous voulez comparer deux Cartes puis, le code ci-dessous peut vous aider à
==
opérateur compare les références de l'objet. Il ne sera jamais vrai avec deuxnew
instances. La réponse correcte est d'utiliserequals
.Chaîne de caractères.hashCode() retournera un int, donc == fonctionnera très bien. En réalité, dans cet exemple, il sera très rare que le même code de hachage viendra pour deux Cartes différentes. Si pas hashCode, nous pouvons utiliser l'algorithme MD5.
Pas si plusieurs chaînes de caractères peuvent revenir par le même hashcode - ce qui est possible. Préférable de recommander quelque chose qui fonctionne correctement, et pas seulement "parfois".
OriginalL'auteur Azee Md