我有一个日历视图小部件,其中的单元格代表每一天。每个单元格都有一个Date对象。 我还有一堆WorkDay对象,它们代表每个日期的工作班次和小时计划。 WorkDay对象中有一个日期。
我想将这些WorkDay对象传递给日历,并且在对日历进行膨胀时,每个单元格应该通过其Date对象检查哪个工作日属于它。
我不想预先处理WorkDay对象组,我想改用密钥。
我的问题是,如果我决定使用HashMap来存储工作日, 我可以使用WorkDay的内部Date对象作为每个HashMap条目的键吗?
喜欢这样
hashMap.put(workDay.getDate(), workDay);
如果这不是一个好主意,我应该使用什么数组/列表/集合/地图结构来存储WorkDay对象?
答案 0 :(得分:3)
从技术上讲,使用Date
作为HashMap
的键是没有问题的,但从设计的角度来看,您可能希望使用Long表示ms
中的时间。
这样做,您的代码变为Date
格式不可知(dd.MM.yy
,yyyy.MM.dd G 'at' hh:mm:ss z
等...),而不仅仅是存储紧凑的Object键(Long
)你的地图。
然后,您还可以将此值转换回您想要的任何类型的对象,例如Calendar
,java Date
,joda time等。
将它存储在数据库,平面文件系统或您正在使用的任何持久性中也更容易。
答案 1 :(得分:0)
您可以将Date
对象用作HashMap
中的密钥,是否会覆盖equals()
和hashCode()
方法。
来自HashMap课程文档:
更正式地说,如果此映射包含从键k到值v的映射,使得(key == null?k == null:key.equals(k)),则此方法返回v;否则返回null。 (最多可以有一个这样的映射。)
如果您想要正确检索WorkDay
个对象,则必须相应地覆盖equals()
和hashCode()
。
查看这些方法的文档:
https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object- https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--
答案 2 :(得分:0)
以下是我决定在Petter Friberg的帮助下做的事。
我创建了这个类:
public class DateKey {
private static SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
private String dateKey;
public DateKey(Date date) {
dateKey = dateFormat.format(date);
}
public String getDateKey() {
return dateKey;
}
}
此类现在作为我的hashmap中的键:
Map<DateKey, WorkDay> schedule = new HashMap<DateKey, WorkDay>();
schedule.put(new DateKey(workDay.getDate()), workDay);
我应该覆盖此类的equals和hashCode吗?