我有下面的场景(修改了一个比实际业务目的更好的场景)。
class Person { int personId; String weekStartDate; }HashMap<List<Person>, Integer> -关键是一个人的13周数据,值是预测。是否有更好的方法来处理上述情况?任何支持此类场景的设计模式
发布于 2018-04-06 13:11:51
依赖:hashCode()的实现使用列表中的元素。因此,稍后在上添加元素会更改操作的结果:
public int hashCode() {
int hashCode = 1;
for (E e : this)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
return hashCode;
}映射不是为可以更改的哈希值的键构建的!当然,以不同的方式实现该方法是没有意义的。
所以:当您的列表都是不变的时,它可以工作,这意味着列表及其任何成员在列表被用作键后都不会修改。但也有一定的风险:如果您稍后忘记了该合同,并且这些列表看到了修改,那么您将遇到有趣的问题。
发布于 2018-04-06 13:10:44
这是因为标准列表实现的哈希代码是用内容的哈希代码计算的。但是,您需要确保在Person类中也实现hashCode和equals,否则您将得到相同的问题这家伙。也见我对这个问题的回答。
发布于 2018-04-06 13:25:34
我建议您定义一个类(比如Data),并在您的hashmap中使用它作为键。因此,使用数周的数据知识覆盖equals/hashcode。
https://stackoverflow.com/questions/49693515
复制相似问题