我有这两个对象。
public Map<String, Set<RuleConditionBl>> countryToNonSplittedRules1 = new HashMap<>;
public Map<String, Set<RuleConditionBl>> countryToNonSplittedRules2 = new HashMap<>;
我有一个比较这两个
的测试即使他们的内容相同,我也会错误
countryToNonSplittedRules1.equals(countryToNonSplittedRules2);
这是一个例子:
我看了这个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 :(得分:0)
我看了一下你的解决方案。
您的实施是正确的(ish)。
首先,如果我没有弄错的话,Range<LocalDate> datesRange
应该不起作用。
Range
不是通用的,因此无法使用参数进行参数化。(如果我错了,请纠正我。)
我将Range<LocalDate> datesRange
更改为List<LocalDate> datesRange
。
除此之外,您的代码是正确的。当您将对象放入countryToNonSplittedRules1
和countryToNonSplittedRules2
时,我认为您的问题是关键值。键值必须相同,否则您无法比较两个映射。
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接口的实现。