2017-03-29 1 views
2

J'ai ces deux objets.comparer le contenu de deux HashMaps avec set <> valeur

public Map<String, Set<RuleConditionBl>> countryToNonSplittedRules1 = new HashMap<>; 
public Map<String, Set<RuleConditionBl>> countryToNonSplittedRules2 = new HashMap<>; 

J'ai un test qui compare ces deux

et même si leur contenu est le même, je reçois faux pour

countryToNonSplittedRules1.equals(countryToNonSplittedRules2);

est un exemple ici:

enter image description here

I lire post, donc je ne sais pas pourquoi ne pas ce retour true

public class RuleConditionBl { 

public int weight; 
public boolean isAll; 
public List<String> countries; 
public UserFlag userFlag; 

@JsonIgnore 
private Range<LocalDate> datesRange; 

public String fromDate; 
public String toDate; 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     RuleConditionBl that = (RuleConditionBl) o; 

     if (weight != that.weight) return false; 
     if (isAll != that.isAll) return false; 
     if (countries != null ? !countries.equals(that.countries) : that.countries != null) return false; 
     if (userFlag != that.userFlag) return false; 
     return datesRange != null ? datesRange.equals(that.datesRange) : that.datesRange == null; 
    } 

    @Override 
    public int hashCode() { 
//  int result = weight; 
     int result = 0; 
     result = 31 * result + (isAll ? 1 : 0); 
     result = 31 * result + (countries != null ? countries.hashCode() : 0); 
     result = 31 * result + (userFlag != null ? userFlag.hashCode() : 0); 
     result = 31 * result + (datesRange != null ? datesRange.hashCode() : 0); 
     return result; 
    } 

{ 
+0

La seule chose que l'on ne peut pas observer dans votre capture d'écran: êtes-vous sûr que les pays sont égaux? Et pour faciliter le débogage: pourquoi ne pas ajouter un joli toString() et imprimer le contenu des deux maps? – GhostCat

+0

Pourquoi avez-vous supprimé votre autre question? ** Encore **, le poids devrait être inclus dans 'hashCode'. – Michael

+0

Vous ne devriez pas comparer les instances 'UserFlag' avec' userFlag! = That.userFlag' (même si les deux semblent être nulles dans votre exemple, cela ne devrait donc pas affecter le résultat). L'utilisation est égale à – Eran

Répondre

0

J'ai regardé un peu à votre solution.

Votre implémentation est correcte (ish).

Tout d'abord, Range<LocalDate> datesRange ne devrait pas fonctionner si je ne me trompe pas. Range n'est pas générique, donc il ne peut pas être paramétré avec des arguments (veuillez me corriger si je me trompe). Je modifie Range<LocalDate> datesRange à List<LocalDate> datesRange.

Donc à part ça, votre code est correct. Je pense que votre problème est les valeurs clés lorsque vous mettez vos objets dans countryToNonSplittedRules1 et countryToNonSplittedRules2. Les valeurs de clé doivent être les mêmes, sinon vous ne pouvez pas comparer les deux cartes.

Map<String, Set<RuleConditionBl>> countryToNonSplittedRules1 = new HashMap<>(); 
Map<String, Set<RuleConditionBl>> countryToNonSplittedRules2 = new HashMap<>(); 


Set<RuleConditionBl> s1 = new LinkedHashSet<>(); 
Set<RuleConditionBl> s2 = new LinkedHashSet<>(); 

//Objects for s1 
RuleConditionBl r1 = new RuleConditionBl(); 
r1.weight = 710; 
r1.userFlag = null; 
r1.isAll = false; 

RuleConditionBl r3 = new RuleConditionBl(); 
r3.weight = 700; 
r3.userFlag = null; 
r3.isAll = false; 

s1.add(r1); 
s1.add(r3); 

countryToNonSplittedRules1.put("r1", s1); 

//Objects for s2 
RuleConditionBl r2 = new RuleConditionBl(); 
r2.weight = 700; 
r2.userFlag = null; 
r2.isAll = false; 

RuleConditionBl r4 = new RuleConditionBl(); 
r4.weight = 710; 
r4.userFlag = null; 
r4.isAll = false; 

s2.add(r2); 
s2.add(r4); 

countryToNonSplittedRules2.put("r1", s2); 

System.out.println(countryToNonSplittedRules1.equals(countryToNonSplittedRules2)); 

sortie:

true 

L'ordre des éléments dans Set importe. D'après la documentation:

Compares the specified object with this set for equality. Returns true if the given object is also a set, the two sets have the same size, and every member of the given set is contained in this set. This ensures that the equals method works properly across different implementations of the Set interface.

+0

Eh bien, commenter pour moi-même. Mon 'Range 'importé peut ne pas être le même import que OP utilise, c'est pourquoi il peut paramétrer' Range' avec des arguments. – kkflf