2017-03-29 8 views
2

私はこれら2つのオブジェクトを持っています。2つのHashMapの内容をset <>の値と比較する

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

私はこれらの2

を比較するテストを持っており、その内容が同じであっても、私は

countryToNonSplittedRules1.equals(countryToNonSplittedRules2);

のための偽の取得ここでは一例です:

enter image description here

Iこのpostを読んで、私はわからないではない、このリターン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

あなたのスクリーンショットでは観察できない1つのことは、各国が等しいことは確かですか?デバッグを簡単にするために:良いtoString()を追加して、両方のマップの内容を出力してみませんか? – GhostCat

+0

他の質問を削除したのはなぜですか? **再び**、重みは 'hashCode'に含まれるべきです。 – Michael

+0

'UserFlag'インスタンスと' userFlag!= that.userFlag'を比較してはいけません(両方ともあなたの例ではnullと表示されているので、結果には影響しません)。 equalsを使用する – Eran

答えて

0

んなぜ私はあなたのソリューションでビットを見てきました。

あなたの実装は正しいです(ish)。

私が間違っていない場合は、まずRange<LocalDate> datesRangeは動作しません。 Rangeは一般的ではないので、引数でパラメータ化することはできません(間違っている場合は私に修正してください)。

Range<LocalDate> datesRangeList<LocalDate> datesRangeに変更します。

それに加えて、あなたのコードは正しいです。あなたの問題は、あなたのオブジェクトをcountryToNonSplittedRules1countryToNonSplittedRules2に入れたときの重要な値だと思います。キーの値は同じでなければなりません。そうでなければ、2つのマップを比較することはできません。

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)); 

出力:

true 

Setの要素の順序は、問題を行います。ドキュメントによると:

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

まあ、自分のためのコメント。私のインポートされた 'Range'は、OPが使用しているのと同じインポートではないかもしれません。なぜなら、引数を使って' Range'をパラメータ化できるのです。 – kkflf

関連する問題