比较两个HashMaps的内容与set<>值

时间:2017-03-29 11:22:38

标签: java hashmap set equals

我有这两个对象。

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

我有一个比较这两个

的测试

即使他们的内容相同,我也会错误

countryToNonSplittedRules1.equals(countryToNonSplittedRules2);

这是一个例子:

enter image description here

我看了这个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;
    }

{

1 个答案:

答案 0 :(得分:0)

我看了一下你的解决方案。

您的实施是正确的(ish)。

首先,如果我没有弄错的话,Range<LocalDate> datesRange应该不起作用。 Range不是通用的,因此无法使用参数进行参数化。(如果我错了,请纠正我。)

我将Range<LocalDate> datesRange更改为List<LocalDate> datesRange

除此之外,您的代码是正确的。当您将对象放入countryToNonSplittedRules1countryToNonSplittedRules2时,我认为您的问题是关键值。键值必须相同,否则您无法比较两个映射。

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中元素的顺序很重要。根据文件:

  

将指定对象与此集进行相等性比较。返回true   如果给定对象也是一个集合,则这两个集合具有相同的大小,   并且给定集合中的每个成员都包含在此集合中。这个   确保equals方法在不同方面正常工作   Set接口的实现。