我有以下方案(修改后的实际业务目的)。
class Person { int personId; String weekStartDate; }
HashMap<List<Person>, Integer>
- 关键是一个人的13周数据,值是预测有没有更好的方法来处理上述情况?任何支持此类场景的设计模式
答案 0 :(得分:3)
取决于:hashCode()的实施使用列表中的元素。因此,稍后在上添加元素会更改该操作的结果:
public int hashCode() {
int hashCode = 1;
for (E e : this)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
return hashCode;
}
地图不能为更改其哈希值的密钥构建!当然,以不同方式实现该方法并不是真的有意义。
所以:当你的列表都是不可变的时,可以工作,这意味着列表或其任何成员都不会被修改 列表被用作关键。但是存在一定的风险:如果您稍后忘记了合同,并且这些列表看到了修改,那么您将遇到有趣的问题。
答案 1 :(得分:1)
这是有效的,因为标准List实现的哈希码是使用内容的哈希码计算的。但是,您需要确保在Person类中实现hashCode
和equals
,否则您将遇到相同的问题this guy had。另见我对这个问题的回答。
答案 2 :(得分:1)
我建议您定义一个类(比如Data
)并将其用作hashmap中的键。相应地通过数周的数据知识覆盖equals/hashcode
。